C# protobuf-net - 默认值覆盖 protobuf 数据中的值
Posted
技术标签:
【中文标题】C# protobuf-net - 默认值覆盖 protobuf 数据中的值【英文标题】:C# protobuf-net - default value overwrites value from protobuf data 【发布时间】:2015-08-28 13:54:47 【问题描述】:我需要使用 protobuf-net serialize/deserialize
类。对于我的类的某些属性,我需要定义一个默认值。我通过设置属性的值来做到这一点。在某些情况下,此默认值会覆盖 protobuf 数据中的值。
代码示例:
public class Program
static void Main(string[] args)
var target = new MyClass
MyBoolean = false
;
using (var stream = new MemoryStream())
Serializer.Serialize(stream, target);
stream.Position = 0;
var actual = Serializer.Deserialize<MyClass>(stream);
//actual.MyBoolean will be true
[ProtoContract(Name = "MyClass")]
public class MyClass
#region Properties
[ProtoMember(3, IsRequired = false, Name = "myBoolean", DataFormat = DataFormat.Default)]
public Boolean MyBoolean get; set; = true;
#endregion
反序列化数据后,MyBoolean 的值为 true。
如何解决此问题?
【问题讨论】:
【参考方案1】:出于性能原因,默认值根本不序列化。 bool 的默认值为 false。您的默认值为 true。要完成这项工作,您必须使用 DefaultValueAttribute
告知您的默认值:
[ProtoMember( 3, IsRequired = false, Name = "myBoolean", DataFormat = DataFormat.Default )]
[DefaultValue(true)]
public Boolean MyBoolean get; set; = true;
【讨论】:
好的,但是为什么我的代码不起作用……我的意思是在类的构造函数中设置了属性……这如何覆盖 protobuf 数据中的值? @musium - protobuf 数据中的值false
isn't,因为 protobuf 认为序列化它没有任何意义,因为 false 是默认值一个布尔值。 Protobuf 没有意识到MyBoolean
的您的 默认值为true
。更多信息:code.google.com/p/protobuf-net/issues/detail?id=199以上是关于C# protobuf-net - 默认值覆盖 protobuf 数据中的值的主要内容,如果未能解决你的问题,请参考以下文章
protobuf-net - 反引号、字典和 .proto 文件