2012-05-09 42 views
4

故障現象:無類型定義串行:System.Array的如何序列化數組?

由於所有的C#陣列從Array類繼承,我認爲這將在protobuf網

[ProtoMember(1)] 
public Array SomeKindOfArray = new int[]{1,2,3,4,5}; 

[ProtoMember(2)] 
public List<Array> SomeKindOfList = new List<Array>(); 

我必須要註冊陣列與有效RuntimeTypeModel?

m.Add(typeof (Array), true); // does not seem to help 

嘗試:

new int[]{1,2,3,4} // works 

(object)new int[] { 1, 2, 3, 4 } // does not work 

(Array)new int[] { 1, 2, 3, 4 } // does not work 

另一種可能的解決方案(找不到SO URL現在):

有一個基本類型的類項的列表。

裹每種類型。例如

class TheBase{} 

class ArrayOfInt { public int[] value;} 

然後,這將成爲轉換和從一個包裝的列表之一。有更簡單的方法嗎?

回答

9

protobuf網真的想了解你的數據嘗試創建一個新的ISerializable的對象這樣

[Serializable()]  
public class ArrayOfInt : ISerializable 
{ 
    public Array ....etc 

,並重寫GetObjectData使用()序列化; Array是不夠的,因爲它不能映射到任何protobuf定義。重複數據(概念上,數組)具有protobuf的規範,該規範不允許額外的空間用於說,一個單獨的基礎上很簡潔,很特定表示,「的[X]」。在protobuf的,所述「的[X]」,預計提前是已經已知的和固定

所以:

[ProtoMember(1)] 
public int[] AnIntegerArray {get;set;} 

[ProtoMember(2)] 
public Customer[] ACustomerArray {get;set;} 

將正常工作。但Array根本不起作用。

根據這是多麼重要,可能還有其他選項,例如(你可能需要調整的名字!):

[ProtoContract] 
[ProtoInclude(1, typeof(DummyWrapper<int>)] 
[ProtoInclude(2, typeof(DummyWrapper<Customer>)] 
public abstract class DummyWrapper { 
    public abstract Type ElementType {get;} 
} 
[ProtoContract] 
public class DummyWrapper<T> : DummyWrapper { 
    [ProtoMember(1)] 
    public T[] TheData {get;set;} 

    public override Type ElementType {get { return typeof(T); } } 
} 

有:

[ProtoMember(1)] 
public DummyWrapper TheData {get;set;} 

會的工作,我懷疑(未經測試)。帶班,有一個protobuf網可以用它來實現繼承一點額外的收入(這也從技術上講,沒有在protobuf的規範支持 - 這是一個墊片,在protobuf網擠壓)。

+0

我喜歡的名字。我將找到一種方法將它們整合到我的下一個項目中。他們將成爲傻瓜包裝! –

+0

任何想法將友好的.net轉換爲protobuf-net的好方法?我想一個擴展方法或兩個與if(obj是int [])語句的列表可能會這樣做。感謝您的解釋。 – sgtz

+0

@sgtz你可以重新短語「從友好的.net轉換爲protobuf網」?我不明白你的意思 –

-1

你爲什麼不從接口ISerializable的

+1

因爲這個問題明確提到protobuf網,不使用'ISerializable'(但可用於*** ***實現'ISerializable') –