2013-06-19 50 views
3

在我的應用程序中,我使用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的最新版本)。

回答

2

Dynamic type的當前實現不支持基元。它僅支持合同類型(其他類別定義爲ProtoContract)。

the wiki

DynamicType - 存儲與類型(默認情況下它包括AssemblyQualifiedName,雖然這可以由用戶來控制)附加的類型的信息。這使得序列化弱模型成爲可能,即對象用於屬性成員的地方,但是目前這僅限於合同類型(不是基元),並且不適用於具有繼承的類型(這些限制可能在以後被刪除) 。與AsReference一樣,這使用了非常不同的佈局格式