DeepClone问题与protobuf-net使用枚举
本文关键字:枚举 protobuf-net 问题 DeepClone | 更新日期: 2023-09-27 18:08:01
我有一个用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
等条件模式)