2016-06-01 92 views
2

我正在試圖找到最佳實踐或一些可接受的設計模式,用於序列化未構建用於序列化的類。下面是我目前實施的方法:使用構造函數從類中序列化數據

例如,考慮一些簡單的類,我想一個構造函數:

public class Coord 
{ 

    public int x { get; private set;} 
    public int y { get; private set;} 

    public Coord(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 

} 

如果我想序列這一點,我不能沒有露出領域完全公開,並提供無參數的構造函數。

是可以接受的做法是創建一些其他類只是爲了保存值我想連載:

public class DataItem 
{ 
    public int x; 
    public int y; 
} 

那麼也許有這些類之間的建造方法和負載

public static DataItem saveCoord (Coord c) 
    { 
     DataItem result = new DataItem(); 
     result.x = c.x; 
     result.y = c.y; 

     return result; 
    } 

public static Coord loadCoord (DataItem di) 
    { 
     Coord result = new Coord (di.x, di.y); 
     return result; 
    } 

那麼我就可以對我的DataItem類執行任何序列化操作。

這種方法可能有哪些批評?有更好的,建立的模式?

對不起,如果我的問題很差,我是一個新鮮的學習者!

+0

你應該看看'ISerializable'接口,https://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable(v=vs.110).aspx –

+0

謝謝Jeroen,看起來像一個非常有用的界面。我編輯我的代碼來改進我的問題,也許這個解決方案對我來說更簡單。 – jetimmins

+0

對此沒有通用的解決方案。一些序列化器(例如'DataContractSerializer')支持代理序列化類型。請參閱[Data Contract Surrogates](https://msdn.microsoft.com/en-us/library/ms733064.aspx)。 'XmlSerializer'沒有,但是你可以在包含類型上添加一個surrogate *屬性*,參見[最優雅的xml序列化的Color結構](https://stackoverflow.com/questions/3280362)。或者,您可以[在'Coord'類型上實現'IXmlSerializable'](https://stackoverflow.com/questions/279534)。請注意,'XmlSerialize'不支持'ISerializable'。 – dbc

回答

0

正如Jeroen van Langen所指出的那樣,如果你想完全控制序列化的發生,你可以實現ISerializable,但這可能是非常不平凡的任務,更重要的是,如果你需要這麼做,類。

我個人一般會傾向於你的第二個例子,但是如果我可以繞過Coord,我不會試圖讓數據項類成爲一個傳輸類,因爲它們在這種情況下似乎是'數據'。使座標公開並可串行化,而不是數據項。

+0

非常感謝Paul。對於剛剛違背主題的人來說,ISerializible看起來很難。我想我需要慢慢來解決。 我在這裏使用這個中間的DataItem類的理由是,實際上,我想序列化的類遠遠大於這個Coord類,有很多變量我想保留私有集合方法,因爲它可能有驗證代碼。 – jetimmins

0

因此,似乎有其他類可以序列化到XML沒有這些XmlSerializer強加的限制 - 即DataContractSerializer。使用它代替XmlSerializer並分別使用[DataContract]和[Datamember]標記我的類和私有屬性非常有效。

我被告知這種方法有一些限制,但在我的情況下,這是一個整潔的解決方案。

謝謝!

相關問題