4

私のアプリケーションでは、protobuf-net を使用してネットワーク経由で送信するメッセージをシリアル化しています。各メッセージには、ヘッダー情報のキーと値のペアのリストがあります。

ただし、例外が発生しており、非常に単純化された例で再現できました。

[TestFixture]
public class SerializationTests
{
    [ProtoContract]
    public class MyType
    {
        [ProtoMember(1, DynamicType = true)]
        public object Property { get; set; }
    }

    [Test]
    public void SerializationTest()
    {
        var myType = new MyType {Property = DateTime.UtcNow.ToBinary()};
        Action action = () => myType.Serialize();
        action.ShouldNotThrow();
    }
}

public static byte[] Serialize<T>(this T itemToSerialize)
{
    using (MemoryStream ms = new MemoryStream())
    {
        ProtoBuf.Serializer.Serialize(ms, itemToSerialize);
        byte[] objectArray = ms.ToArray();
        return objectArray;
    }
}

このテストは現在、次の例外で失敗します: System.InvalidOperationException: "Dynamic type is not a contract-type: Int64".

プロパティはオブジェクト型なので、そこにさまざまなデータを入れることができます。これはヘッダー情報であるためです。それぞれが強く型付けされた複数のヘッダー リストを持たないようにしています。

Property を long 型に変更すると、テストは機能します。DynamicType=true を削除すると、型オブジェクトのシリアライザーが存在しないことを示す例外が発生します。

Property の型を変更するとテストが機能するため、DynamicType と long が一緒に機能しないことを暗示しているようです。

私は現在r640を使用しています(NuGetの最新版だと思います)。

4

1 に答える 1

2

の現在の実装でDynamic typeは、プリミティブはサポートされていません。コントラクト型 (何らかの形で として定義されている他のクラス) のみをサポートしますProtoContract

ウィキから:

DynamicType - 型と共に追加の Type 情報を格納します (既定では AssemblyQualifiedName が含まれますが、これはユーザーが制御できます)。これにより、弱いモデル、つまりオブジェクトがプロパティ メンバーに使用される場合のシリアル化が可能になりますが、現在これはコントラクト型 (プリミティブではない) に限定されており、継承のある型では機能しません (これらの制限は後で削除される可能性があります)。 . AsReference と同様に、これは非常に異なるレイアウト形式を使用します

于 2013-12-30T22:54:26.967 に答える