作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个用 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/
我是一名优秀的程序员,十分优秀!