1

protobuf-net でシリアライズしたい 2 つの単純なクラスがあります。すべて問題ないように見えますが、逆シリアル化すると Body プロパティが null になります。私が間違っていることは何ですか?

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using ProtoBuf;

namespace Protobuf_test
{
    public class Program
    {
        private static void Main(string[] args)
        {
            var innerObject = new Inner() { Id = Guid.NewGuid() };
            var outerObject = new Outer() { Body = innerObject };

            using (var stream = File.Create("serialized.bin"))
            {
                Serializer.Serialize(stream, outerObject);
            }
            using (var file = File.OpenRead("serialized.bin"))
            {
                var deserialized = Serializer.Deserialize<Outer>(file);
            }
        }
    }

    [DataContract]
    public class Inner
    {
        [DataMember]
        public Guid Id { get; set; }
    }

    [DataContract]
    public class Outer
    {
        [DataMember]
        public object Body { get; set; }
    }
}
4

2 に答える 2

1

2 つの問題:

  1. protobuf-net には、メンバーごとに正の整数キーが必要です。Order=これはonで提供できます[DataMember]。数字が小さいほど良いため、通常、これは123...を意味します。

  2. protobuf 仕様は、スキーマにバインドされたシリアライザーです。事前にデータを理解したい。objectうまく動作しません。

しかし、これはうまくいくでしょう:

[DataContract]
public class Inner
{
    [DataMember(Order=1)]
    public Guid Id { get; set; }
}

[DataContract]
public class Outer
{
    [DataMember(Order=1)]
    public Inner Body { get; set; }
}

柔軟に型指定されたデータ (つまり ) のサポートいくつかありますがobject、これは protobuf-net 固有のものであることに注意してください (移植性に関してはうまく機能しません)。最初に型付きアプローチを確認することをお勧めします。しかし、それは可能です。

既存のモデルを変更できない場合、最初にアドバイスすることは、既存のモデルによく似ているが、シリアル化のマークが付けられた別の DTO モデルを追加し、それを操作して、2 つのモデル間でシムを行うことです。それができない場合は、システムを構成して、a: メンバーのキーを定義し、b: dynamicを使用するように指示する必要があります。例えば:

var config = RuntimeTypeModel.Default;
config.Add(typeof(Inner),false).Add("Id");
config.Add(typeof(Outer), false).AddField(1, "Body").DynamicType = true;

(注:Serializer.*は基本的に へのショートカットRuntimeTypeModel.Default.*であるため、この構成は のメソッドと通信しますSerializer.*)

于 2013-01-10T13:26:04.847 に答える