使用 DataContract 属性时 ProtoBuf.NET 未序列化
Posted
技术标签:
【中文标题】使用 DataContract 属性时 ProtoBuf.NET 未序列化【英文标题】:ProtoBuf.NET not serializing when using DataContract attributes 【发布时间】:2012-09-10 14:46:50 【问题描述】:我在 NuGet (2.0.0.480) 上使用最新版本的 ProtoBuf,它不会序列化标有 DataContract
/DataMember
属性的类型:
[DataContract]
public class Person
[DataMember]
public string Firstname get; set;
class Program
static void Main(string[] args)
var outputFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "person.dat");
var person = new Person Firstname = "ben" ;
using (var fs = new FileStream(outputFile, FileMode.OpenOrCreate))
Serializer.Serialize(fs, person);
using (var fs = File.OpenRead(outputFile))
var result = Serializer.Deserialize<Person>(fs);
Console.WriteLine(result.Firstname);
Console.ReadLine();
但是,如果我使用 ProtoBuf 特定属性来装饰我的类:
[ProtoContract]
public class Person
[ProtoMember(1)]
public string Firstname get; set;
它按预期工作。
【问题讨论】:
【参考方案1】:它需要Order
属性来获得唯一且可靠的密钥号:
[DataContract]
public class Person
[DataMember(Order=1)]
public string Firstname get; set;
【讨论】:
【参考方案2】:在使用[DataMember]
时,我应该更仔细地阅读文档必须指定订单。
例如
[DataMember(Order = 1)]
【讨论】:
【参考方案3】:除了 Marc 和 Ben 的回答之外,请注意您必须将 order 值设置为大于 0。 我们曾经在使用 BCL 序列化程序时从 0 开始顺序,但 protobuf-net 忽略了顺序为 0 的数据成员。
【讨论】:
以上是关于使用 DataContract 属性时 ProtoBuf.NET 未序列化的主要内容,如果未能解决你的问题,请参考以下文章
使用 protobuf-net.Grpc 生成通用服务的 .proto 文件
我可以同时使用 DataContract 和 Serializable 吗?