2011-02-02 40 views
3

連載我有以下類: -找不到合適的默認類型編碼。在使用protobuf的

[Serializable] 
[DataContract(Name = "StateValueWrapper")] 
public class StateValueWrapper 
{ 
    [DataMember(Order = 1)] 
    public Type StateValueType { get; set; } 

    [DataMember(Order = 2)] 
    public object WrappedObj { get; set; } 
} 

我試圖使用序列化序列化protobuf.net.While得到一個錯誤上面類的對象「沒有合適的默認類型的編碼找到。」請給我建議我需要爲此做些什麼?下面是我對serilization代碼: -

  MemoryStream ms = new MemoryStream(); 
      var srariazeObj = new StateValueWrapper(); 
      srariazeObj.StateValueType = typeof(int); 
      srariazeObj.WrappedObj = 5; 
      ProtoBuf.Serializer.NonGeneric.Serialize(ms, srariazeObj); 

回答

1

Type無法通過protobuf網序列化,也不是object。我明白你在做什麼,如果你真的不能提前知道類型。我懷疑你應該考慮序列化AssemblyQualifiedName的類型(一個string)和一個byte[]對象(通過MemoryStream)。如果你喜歡(讓我知道),我可以稍後舉一個例子。

但是,如果有可能說出一個有限失去的,你需要支持的類型(例如,「字符串或int或客戶或GUID 」)則是一個更有效的方便方法 - 如果這是你的情況,我可以再舉一個例子 - 讓我知道。

+0

是Marc我有一套使用protobuf序列化的有限類型。如果你分享你在上一篇文章中提到的方法,那將是非常好的。 – 2011-02-03 04:17:08

1

現在我所做的我已經創建了一個自定義會話提供程序並將其傳遞給StateValueWrapper對象。在serialize方法中,首先我使用protobuf序列化StateValueWrapper的WrappedObj,並將其分配回WrappedObj。現在,二進制序列化器將序列化包含類型信息和字節數組的StateValueWrapper對象。雖然反序列化的第一個二進制串行器將反序列化SessionStateItemCollection並返回帶有類型info和byte Array的StateValueWrapper,然後我使用StateValueWrapper的類型信息完成了WrappedObj的反序列化(protobuf)。