Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# protobuf net的DeepClone问题-使用枚举_C#_.net_Protobuf Net - Fatal编程技术网

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

C# protobuf net的DeepClone问题-使用枚举,c#,.net,protobuf-net,C#,.net,Protobuf Net,我有一个用DataContract和ProtoContract(ImplicitFields=ImplicitFields.AllFields)修饰的类,其中一个成员和属性是Enum。我正在尝试深度克隆对象,但是,当源在枚举成员中具有映射到值0的值时,在克隆后我将获得默认值 课程为: public enum A { A0 = 0, A1 = 1, A2 = 2 } [ProtoContract(ImplicitFields = ImplicitFields.AllFiel

我有一个用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);
Ac a1=新的Ac();
a1.sa=“dfdf”;
a1.aa=A.A0;
Ac a2=新的Ac();
a2.sa=“dfdf”;
a2.aa=A.A1;
var sa1=Serializer.DeepClone(a1);
var sa2=Serializer.DeepClone(a2);

出于传统原因,protobuf net使用“隐式零默认值”行为。我对v1感到遗憾,但我们已经做到了。因此,隐式默认值为
0
==
A0
。但是,您可以对其进行再教育:

[DefaultValue(A.A2)]
private A _aa = A.A2;
(即,告诉系统您的构造函数将要做什么)

或者,如果您满足于了解protobuf网络使用情况,则可以更改此行为:

RuntimeTypeModel.Default.UseImplicitZeroDefaults = false;

在这种情况下,只应指定显式默认值(
[DefaultValue]
和条件模式,如
应序列化*
/
*)处理。

是否可能将值0用作默认值并在DesirialZetion时忽略?基本上,在完整解决方案中,我使用运行时类型模型进行继承-我现在将检查它,添加默认值后,我将获得相同的行为,也尝试了默认值。UseImplicitzDesiveFaults=false;在运行时模型上,can SkipConstructor=true help?@li raz这将阻止字段初始值设定项和构造函数运行,因此是的,它可能会“修复”它,但出于不同的原因-我不确定推荐这样做。我只是使用
[DefaultValue(A.A2)]
在本地测试了您的代码-它工作得很好。。。