8

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

期待どおりに動作します。

4

3 に答える 3

2

[DataMember] Order must be specifiedを使用する場合は、ドキュメントをもっとよく読む必要がありました。

例えば

[DataMember(Order = 1)]

于 2012-09-10T14:51:45.743 に答える
2

Marc と Ben の回答に加えて、順序の値を 0 より大きい値に設定する必要があることに注意してください
。BCL シリアライザーを使用する場合は順序を 0 から開始していましたが、protobuf-net は順序が 0 のデータ メンバーを無視しています。

于 2012-11-13T12:39:11.667 に答える