2012-09-18 60 views
9

我正在試圖序列List<Tuple<string, Type, object>>如果出現以下錯誤消息:沒有串行類型定義:System.Type的protobuf網錯誤消息:沒有串行類型定義:System.Type的

我都嘗試,只是序列化上述集合或序列化與protoMember定義的集合具有相同集合的類。兩者都會導致相同的錯誤消息。

這是不支持的類型嗎?我認爲它是支持的,我忽略了別的東西,但也許我不正確?

感謝任何指針可以幫助解決這個...

+0

見更新的答案;這實際上包含在以後的版本 –

回答

12

編輯:

Type序列化的支持包括在R580


protobuf網旨在系列化你數據,而不是您的實施; Type是一個實現細節。嚴格地說,添加並不是非常困難(一些特定於實現的細節已經基本上已經通過彙編限定名來存儲Type信息),但是:它不是關鍵場景,並且在許多情況下方法是而不是我鼓勵你序列化 - 協議緩衝區的全部重點是你可以在任何平臺上加載數據,而版本容差是一個關鍵特性。存儲Type信息違反了這些。

還應當指出的是,大多數其他串行(也許除了BinaryFormatter,這已經打破了平臺/版本容忍每個規則)將拒絕序列化Type; XmlSerializer,DataContractSerializer,JavaScriptSerializer全部爲這種情況拋出一個異常(我只是檢查它們)。

此外:object甚至更​​少支持,除非您使用DynamicType功能。


下面是它可以通過替代來實現對Type

using ProtoBuf; 
using ProtoBuf.Meta; 
using System; 
using System.Runtime.Serialization; 

static class Program 
{ 
    public static void Main(string[] args) 
    { 
     // register a surrogate for Type 
     RuntimeTypeModel.Default.Add(typeof(Type), false) 
           .SetSurrogate(typeof(TypeSurrogate)); 
     // test it 
     var clone = Serializer.DeepClone(new Foo { Type = typeof(string) }); 
    } 
} 

[ProtoContract] 
class TypeSurrogate 
{ 
    [ProtoMember(1)] 
    public string AssemblyQualifiedName { get; set; } 
    // protobuf-net wants an implicit or explicit operator between the types 
    public static implicit operator Type(TypeSurrogate value) 
    { 
     return value==null ? null : Type.GetType(value.AssemblyQualifiedName); 
    } 
    public static implicit operator TypeSurrogate(Type value) 
    { 
     return value == null ? null : new TypeSurrogate { 
      AssemblyQualifiedName = value.AssemblyQualifiedName }; 
    } 
} 

[DataContract] 
public class Foo 
{ 
    [DataMember(Order=1)] 
    public Type Type { get; set; } 
} 
+0

感謝您的意見。但你將如何去序列化這種收集?我需要通過只允許傳輸字節數組的消息總線發送它。將Type轉換爲字符串,然後將其轉換回Type類型選項?我同意你的對象類型,我想我之前問過你,並且指出了我的DynamicType特性。 –

+0

@Freddy事實上,最簡單的事情就是使用'.AssemblyQualifiedName'和'Type.GetType(string)'來存儲'string,string,object'。如果你想得到*真的*異乎尋常的,你可以爲'Type'增加一個* surrogate *(protobuf-net支持這個)。在技​​術層面上,我可以直接支持它,而不會有太多的痛苦,但是看起來好像我會讓人們用火箭筒輕鬆地在腳下自己射擊。 –

+0

感謝您的指點,真的很感激。按照給定的平臺和版本獨立性是期望的目標,保持圖書館聽起來是合理的。我已經假設你在回答中描述了你通過程序集限定名存儲類型,否則我可能不知道解串器如何在沒有類型信息的幫助下處理其任務。但是我可能完全不在,因爲我根本沒有看過你的源代碼。 –

相關問題