2010-10-18 36 views
3

我有一個類與API進行通信,需要對接觸到的任何數據進行一些轉換。這個類也是相同的:屬性只應由串行器設置

public class SerializeMe 
{ 
    public SerializeMe(string someString) 
    { 
     _someString = someString; 
    } 

    private string _someString; 
    public string TransformedValue 
    { 
     get { _someString = TransformToSomething(); 
       return _someString; } 
     set { _someString = value; } 
    } 
} 

對於我的API調用者,我通過序列化這些類來記錄每個請求和響應。他們幾乎充當xml架構。

現在一切正常,我唯一的問題是有人可以理論上嘗試設置,並最終沒有得到預期的結果。它主要是一個設計問題,只是爲了讓我的代碼負責。我希望能夠使用一個私有集合,但XmlSerializer抱怨它。

是否有一個屬性或其他技術能夠使變換值不可譯,除了序列化程序?

另外如果沒有選項,則將該屬性設置爲Obsolete是一個選項。是否還有其他更適合使用的屬性?

回答

2

這是XmlSerializer的一種痛苦,用DataContractSerialzer(它也可以在沒有XmlSerializer需要的無參數ctor的情況下)工作。只需將該類型標記爲[DataContract],並將字段(不屬性)標記爲[DataMember]。

[DataContract] 
public class SerializeMe 
{ 
    public SerializeMe(string someString) 
    { 
        _someString = someString; 
    } 
    [DataMember] 
    private string _someString; 
    public string TransformedValue 
    { 
        get { _someString = TransformToSomething(); 
              return _someString; } 
        private set { _someString = value; } 
    } 
} 
+0

此外,DataContractSerializer比XmlSerializer更高性能,並且可以處理字段以及屬性。一個缺點是你不能控制Xml的結構,所以如果你需要它的特定格式,你將無法使用它。 – Bronumski 2010-10-18 16:40:20

+0

@bronumski如果性能是關鍵目標,我會使用protobuf網而不是:) – 2010-10-18 18:04:22

0

不幸的是,XmlSerializer只能使用公共getters/setter序列化屬性(除非你指定通過IXmlSerializable自己的序列化)。

我不時使用的唯一解決方法(它是一種破解,並且不符合.NET設計準則,因此我不喜歡這樣做)具有一個空的公共屬性二傳手然後用另一種方法設置專用的後盾變量:

public class SerializeMe 
{ 
    private string _someString; 
    public string SomeString 
    { 
     get 
     { 
      _someString = TransformToSomething(); 
      return _someString; 
     } 
     set { } 
    } 

    public void SetString(string val) { _someString = val; } 
} 

顯然IXmlSerializable是更多的工作,但它肯定是從長遠來看(不提的是,它不是黑客攻擊)更好的決定。

2

XmlSerializer開箱即用,但在使用IXmlSerializable界面之後,您可以獲得靈活性。 XmlSerializer將查看該對象,如果它實現IXmlSerializable,它將調用接口公開的對象上的方法。是的,它是更多的工作,但你有一個更好的粒度方法,你的對象是如何de /序列化。