在我的應用程序中,我使用protobuf-net將序列化的消息通過線路發送。每條消息都有一個用於標題信息的鍵值對列表。protobuf-net使用DynamicType序列化System.Object引發異常
不過,我遇到了一個例外,我已經能夠用非常簡單的例子,以重現:
[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:「動態類型不是合同類型:Int64「。
該屬性是對象類型,所以我可以把各種數據放在那裏 - 因爲這是頭信息。我試圖避免有多個頭列表,其中每個強列表。
如果我將Property更改爲long類型,則測試將起作用。如果我刪除了DynamicType = true,那麼我得到一個異常,指出沒有類型對象的序列化程序存在。
由於測試在我更改屬性類型時起作用,這似乎意味着DynamicType和long不能一起工作。
我目前正在使用r640(我相信這是NuGet的最新版本)。