使用DataContract属性时,ProtoBuf.NET不进行序列化

时间:2012-09-10 14:46:51

标签: protobuf-net

我在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; }
}

它按预期工作。

3 个答案:

答案 0 :(得分:8)

需要Order属性才能获得唯一且可靠的键号:

[DataContract]
public class Person
{
    [DataMember(Order=1)]
    public string Firstname { get; set; }
}

答案 1 :(得分:2)

我应该更仔细地阅读文档,使用[DataMember] 时必须指定订单

e.g。

[DataMember(Order = 1)]

答案 2 :(得分:2)

除了Marc和Ben的答案外,请注意您必须将订单值设置为大于0 我们曾经在使用BCL序列化器时从0开始订单,但是protobuf-net忽略了订单为0的数据成员。