c# - protobuf-net 的 DeepClone 问题 - 使用枚举

标签 c# .net protobuf-net

我有一个用 DataContract 和 ProtoContract(ImplicitFields = ImplicitFields.AllFields) 修饰的类,其中一个成员和属性是 Enum。我正在尝试深度克隆该对象,但是当源在枚举成员中具有映射到值 0 的值时,在克隆之后我得到默认值

类是:

public enum A {
    A0 = 0,
    A1 = 1,
    A2 = 2
}
[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public class Ac {
    private A _aa = A.A2;
    public string sa { get; set; }
    public A aa { get { return _aa; } set { _aa = value; } }
}

带有序列化代码:

Ac a1 = new Ac();
a1.sa = "dfdf";
a1.aa = A.A0;
Ac a2 = new Ac();
a2.sa = "dfdf";
a2.aa = A.A1;
var sa1 = Serializer.DeepClone<Ac>(a1);
var sa2 = Serializer.DeepClone<Ac>(a2);

最佳答案

出于遗留原因,protobuf-net 使用“隐式零默认值”行为。我对 v1 感到遗憾,但我们就在那里。因此,隐式默认值是 0 === A0。但是,您可以对其进行再教育:

[DefaultValue(A.A2)]
private A _aa = A.A2;

(即告诉系统你的构造函数要做什么)

或者,如果您对了解 protobuf-net 的使用感到满意 - 您可以更改此行为:

RuntimeTypeModel.Default.UseImplicitZeroDefaults = false;

在这种情况下,仅处理显式默认值([DefaultValue] 和条件模式,例如 ShouldSerialize*/*Specified)。

关于c# - protobuf-net 的 DeepClone 问题 - 使用枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15886486/

相关文章:

c# - 访问在运行时创建的任何后台 worker

c# - 旋转和打印正方形

C# RSA 使用给定的 PKCS#1 公钥加密文本

c# - WPF 应用程序中的 SendKeys.Send 方法

.net - 将自定义 ValueProviderFactories 添加到 ASP.NET MVC3?

c# - 对循环缓冲区进行排序的最有效方法

c# - 无法通过 Windows 上的 Docker 访问 .Net Core 应用程序(本地主机)

c# - HttpContext.Current.Cache 是线程安全的吗?

iphone - iPad + WCF 双工 + protobuf

c# - Windows Phone 7 上的 Protobuf-net