使用 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 未序列化的主要内容,如果未能解决你的问题,请参考以下文章

如何找出类是不是具有 DataContract 属性?

如何使用 DataContract 添加 XML 属性

使用 protobuf-net.Grpc 生成通用服务的 .proto 文件

我可以同时使用 DataContract 和 Serializable 吗?

用于继承的 Protobuf-net .proto 文件生成

.net 中 DataContract 属性和 Serializable 属性之间的区别