DeepClone与protobuf-net有关 - 使用枚举

时间:2013-04-08 18:39:30

标签: 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);

1 个答案:

答案 0 :(得分:3)

由于遗留原因,protobuf-net使用“隐式零默认值”行为。我对v1感到后悔但是我们有。因此隐式默认值为0 === A0。但是,你可以重新教育它:

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

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

或者,如果您满足于了解自己的protobuf-net使用情况,则可以更改此行为:

RuntimeTypeModel.Default.UseImplicitZeroDefaults = false;

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