私のアプリケーションでは、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の最新版だと思います)。