2011-12-23 22 views
2

我有下面的類:雙串行化定製

public class SomeClass 
{ 
    public double SomeValue {get;set;} 
} 

我需要XmlSerializer序列化,但我需要用10序列中繁殖的價值和反序列化時10分才。有沒有什麼辦法來實現這個定製邏輯?

回答

6

這可能是有點哈克,但涉及的不是連載你的主要財產,但序列化的目的而提供的虛擬財產即獲取/設置支持字段爲你的主屬性格式正確。

public class SomeClass 
{ 
    private double _someValue; 

    [XmlIgnore()] 
    public double SomeValue { 
    get { return _someValue; } 
    set {_someValue = value;} 
    } 

    [XmlElement("SomeValue")] 
    public double SomeValueSerialised 
    { 
     get { return _someValue * 10; } 
     set { _someValue = value/10; } 
    } 
} 

編輯:想指出,IXmlSerializable的實施可能做到這一點更清潔的方式,但它真的取決於你的類字段的數量,以及如何懶你感到...

+1

您可能要加上'[的XmlElement( 「someValue中」)]'所以XML看起來像原來 – 2011-12-23 12:14:53

+0

@Marc Gravell - 不知道你能做到這一點。回答修改與您的建議。 – Paddy 2011-12-23 13:42:13

+1

而且可能是它是EditorBrowsable(EditorBrowsableState.Never)添加到SoveValueSerialized屬性實際上 – SiberianGuy 2011-12-23 15:00:27

0

您可以實現自己IXmlSerializable

public class SomeClass:IXmlSerializable 
{ 
    public double SomeValue {get;set;} 
// implement here below read write as needed 
// Xml Serialization Infrastructure 

public void WriteXml (XmlWriter writer) 
{ 
    ... 
} 

public void ReadXml (XmlReader reader) 
{ 
    ... 
} 

public XmlSchema GetSchema() 
{ 
    return(null); 
} 
} 
0

您可以控制通過實現IXmlSerializable的接口序列化。 嘗試了這一點..

public class SomeClass: IXmlSerializable 
{ 
    private double someValue; 
    public double SomeValue 
    { 
     get{ return someValue;} 
     set{ someValue = value;} 
    } 
    public void WriteXml (XmlWriter writer) 
    { 
     writer.WriteString(someValue * 10); 
    } 

    public void ReadXml (XmlReader reader) 
    { 
     someValue = Convert.ToDouble(reader.ReadString())/10; 
    } 
} 
+0

這並不適用於'XmlSerializer' – 2011-12-23 12:15:30

+0

@Marc ..感謝指出這一點。我已經修改我的答案 – 2011-12-23 12:19:51

+0

執行'IXmlSerializable'更比複雜一些... – 2011-12-23 12:41:09