2015-10-21 53 views
1

我試圖實現一個IXmlSerializable類需要初始化,但由於序列化使用默認的構造函數,所以無法完成初始化。任何提示如何完成?初始化一個可序列化的對象[.NET]

下面是一個示例類。它有一個數組,當它反序列化時,它必須複製/解碼只有從XML文件中固定數量的字節。需要初始化來告訴它固定號碼是什麼。

public class XmlByteArray : IXmlSerializable 
{ 
    public Byte[] Values; 

    // serialization will use this constructor so Values won't be instantiated 
    public XmlByteArray() 
    { 
    } 

    // Values array needs to be instantiated 
    public XmlByteArray(int size) 
    { 
     Values = new Byte[size]; 
    } 

    public XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     var str = reader.ReadString(); 
     reader.ReadEndElement(); 

     // decode str into a Byte array 
     Byte[] v = Enumerable.Range(0, str.Length) 
       .Where(x => x % 2 == 0) 
       .Select(x => Convert.ToByte(str.Substring(x, 2), 16)) 
       .ToArray(); 
     Array.Copy(v, Values, Values.Length); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     var str = BitConverter.ToString(Values).Replace("-", ""); 
     writer.WriteString(str); 
    } 
} 

如果這是C++我想通過使XmlByteArray一個模板,需要一個int類型,而不是在C#允許解決這個問題。

要添加更多的細節,在意見中的要求,我想要做的是使用的XmlByteArray對象在另一個類和閱讀這樣

<SomeClass> 
    <memberA>blah blah</memberA> 
    <memberB>0A0B0C0D</memberB> 
    <memberC>0A0B0D</memberC> 
</SomeClass> 

文件序列化類是

public class SomeClass 
{ 
    public SomeClass() 
    { } 
    public string memberA = ""; 
    public XmlByteArray memberB = new XmlByteArray(2); 
    public XmlByteArray memberC = new XmlByteArray(3); 
} 

反序列化後memberB.Values應該有{0x0A, 0x0B}而不是{0x0A, 0x0B, 0x0C, 0x0D}。序列化文件意味着需要手動編輯,因此反序列化的數據可能與程序如何序列化它們不一致。

PS。在一個側面說明我不得不添加一個ReadEndElement()致電ReadXml()獲得閱讀權利,雖然這MSDN example沒有它。不知道爲什麼它需要。

+1

http://stackoverflow.com/questions/1266547/how-do-you-find-out-when-youve-been-loaded-via-xml-serialization –

+0

解串器應該知道有多少個字節來讀?它不會是第一個序列化的字節數? –

+0

@DStanley如果XML序列化程序會調用某種工廠來創建對象,工廠可以爲該類中的該參數提供一些值。 –

回答

1

不,在XML序列化中沒有提供任何類型的工廠來創建對象而不是默認構造函數的機制。