2012-05-09 33 views
3

這是XML輸出我得到當對象序列化:如何使用XmlSerializer序列化'System.Numerics.Complex'?

<MyClass>    
    <Complex /> 
    <Complex /> 
    <Complex /> 
    <Complex /> 
</MyClass> 

Complex結構被標記爲可序列化的,並且是一個結構,它有一個隱含的參數的構造函數。那麼,爲什麼不是每個Complex對象都會對其實部和虛部進行序列化?這是否與結構的'Real'和'Imaginary'屬性具有getter而不是setter?有關?

謝謝。

+0

我鏈接到msdn主題。請查看以上情況,以防上述情況無效:http://msdn.microsoft.com/en-us/library/system.numerics.complex.aspx – alhazen

+0

發佈您複雜結構中的內容。 –

+0

嗯,你是對的,我可以很容易地重新創建它。 –

回答

2

XmlSerializer不會序列化沒有setter的屬性(IIRC它只有序列化器public屬性同時具有public getter和setter)。您有幾種選擇:

  • 更換System.Numerics.Complex類型與類型創建它(並具有「全」屬性)
  • 更改MyClass類來處理複雜的數字的序列化(和反序列化) ,通過IXmlSerializable界面。

第二個選項如下所示。

public class StackOverflow_10523009 
{ 
    public class MyClass : IXmlSerializable 
    { 
     public Complex[] ComplexNumbers; 

     public XmlSchema GetSchema() 
     { 
      return null; 
     } 

     public void ReadXml(XmlReader reader) 
     { 
      reader.ReadStartElement("MyClass"); 
      List<Complex> numbers = new List<Complex>(); 
      while (reader.IsStartElement("Complex")) 
      { 
       Complex c = new Complex(
        double.Parse(reader.GetAttribute("Real")), 
        double.Parse(reader.GetAttribute("Imaginary"))); 
       numbers.Add(c); 
       reader.Skip(); 
      } 

      reader.ReadEndElement(); 
      this.ComplexNumbers = numbers.ToArray(); 
     } 

     public void WriteXml(XmlWriter writer) 
     { 
      foreach (var complex in ComplexNumbers) 
      { 
       writer.WriteStartElement("Complex"); 
       writer.WriteStartAttribute("Real"); writer.WriteValue(complex.Real); writer.WriteEndAttribute(); 
       writer.WriteStartAttribute("Imaginary"); writer.WriteValue(complex.Imaginary); writer.WriteEndAttribute(); 
       writer.WriteEndElement(); 
      } 
     } 

     public override string ToString() 
     { 
      return "MyClass[" + string.Join(",", ComplexNumbers) + "]"; 
     } 
    } 
    public static void Test() 
    { 
     MyClass mc = new MyClass { ComplexNumbers = new Complex[] { new Complex(3, 4), new Complex(0, 1), new Complex(1, 0) } }; 
     XmlSerializer xs = new XmlSerializer(typeof(MyClass)); 
     MemoryStream ms = new MemoryStream(); 
     xs.Serialize(ms, mc); 
     Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); 
     ms.Position = 0; 
     MyClass mc2 = (MyClass)xs.Deserialize(ms); 
     Console.WriteLine(mc2); 
    } 
} 
3

它取決於您用於序列化對象的序列化程序的實現。
如果你試試這個,你會得到你期待什麼:

using System.IO; 
using System.Numerics; 
using System.Runtime.Serialization.Formatters.Soap; 

public class Test { 
    public static void Main() { 
     var c = new Complex(1, 2); 
     Stream stream = File.Open("data.xml", FileMode.Create); 
     SoapFormatter formatter = new SoapFormatter(); 
     formatter.Serialize(stream, c); 
     stream.Close(); 
    } 
} 

相反,如果你使用的System.Xml.Serialization命名空間的類,你會得到類似的東西給你貼什麼:

using System; 
using System.IO; 
using System.Numerics; 
using System.Xml.Serialization; 

public class Test { 
    public static void Main() { 
     var c = new Complex(1, 2); 
     XmlSerializer s = new XmlSerializer(typeof(Complex)); 
     StringWriter sw = new StringWriter(); 
     s.Serialize(sw, c); 
     Console.WriteLine(sw.ToString()); 
    } 
} 

我認爲這是由於XmlSerializer不會序列化私有成員(如在Complex結構中的m_realm_imaginary)。

相關問題