gpt4 book ai didi

c# - 使用 DataContract 实现不同类型(bool? 和 enum)之间的映射

转载 作者:太空宇宙 更新时间:2023-11-03 10:25:38 25 4
gpt4 key购买 nike

我正在使用 DataContract 序列化/反序列化用户机器上的对象。所以基本上是一个保存/加载场景。

我有一个 DataContract,它有一个 bool? 类型的有序 DataMember,现在我需要将它更改为一个 Enum 。它被订购是因为其中一个序列化程序是 protobuf-net .

现在的样子:

[DataContract]
public class Result
{
[DataMember(Order = 3)]
public bool? Accepted { get; set; }
}

它需要是:

public enum ResultDecisionStatus
{
Accepted, //// map as 'true' for 'bool?'
Rejected, //// map as 'false' for 'bool?'
Neutral, //// new
Unknown //// map as 'null' for 'bool?'
}

[DataContract]
public class Result
{
[DataMember(Order = 4?)] //// I assume ordering might have to change
public ResultDecisionStatus DecisionStatus { get; set; }
}

我实现了以下在我看来hacky但似乎有效的方法。我以相同的顺序保留 Accepted 并将其更改为 private 并设置一个变量以在反序列化时将其映射到新的 Enum。这是好的设计吗?感觉很奇怪。

[DataContract]
public class Result
{
[DataMember(Order = 4)]
public ResultDecisionStatus DecisionStatus { get; set; }

[DataMember(Order = 3)]
private bool? Accepted { get; set; }

[DataMember(Order = 1003)]
private bool AcceptedToDecisionStatusMapped { get; set; }

[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
if (!AcceptedToDecisionStatusMapped)
{
switch(Accepted)
{
case true:
DecisionStatus = ResultDecisionStatus.Accepted;
break;
case false:
DecisionStatus = ResultDecisionStatus.Rejected;
break;
case null:
DecisionStatus = ResultDecisionStatus.Unknown;
break;
}
AcceptedToDecisionStatusMapped = true;
}
}
}

问题:是否有任何正确的方法可以在不保留旧成员并为每个版本添加额外映射属性的情况下实现有序DataContracts 类型之间的映射?

最佳答案

试试这个:

[DataContract]
public class Result
{
private ResultDecisionStatus? _decisionStatus;

[DataMember(Order = 3)]
public bool? Accepted { get; set; }

[DataMember(Order = 4)]
public ResultDecisionStatus DecisionStatus
{
get
{
if (_decisionStatus.HasValue)
{
return _decisionStatus.Value;
}
else if (Accepted.HasValue)
{
return Accepted.Value
? ResultDecisionStatus.Accepted
: ResultDecisionStatus.Rejected;
}
else
{
return ResultDecisionStatus.Unknown;
}
}
set
{
_decisionStatus = value;
}
}
}

这应该基本上允许使用旧契约(Contract)和新契约(Contract)的数据进行互操作。如果同时使用 34 会很奇怪,但我认为在您的情况下它会是其中之一。

更新:

看我的另一个答案。在您的情况下,由于 bool 值可以轻松映射到枚举值,因此有一种更简单的方法。为某人可能没有这种奢侈的情况留下这个答案。

关于c# - 使用 DataContract 实现不同类型(bool? 和 enum)之间的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31683841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com