2017-09-15 105 views
1

我在C#中遇到Xml.Serialization問題,希望有所幫助。我有一個我想要序列化的MyObject列表。 MyObject類包含一個System.Windows.Forms.DataVisualization.Charting.DataPoint列表,但我沒有得到序列化的MyObject列表。C#序列化包含更多列表的對象列表

public class MyObject 
{ 
    public Guid ID { get; set; } 

    public string Name { get; set; } 

    public bool Status { get; set; } 

    public List<DataPoint> History { get; set; } = new List<DataPoint>(); 
} 

我使用此代碼序列:

List<MyObject> lstObjects; 

using (FileStream fileStrm = new FileStream([outputPath], FileMode.Create)) 
{ 
    XmlSerializer xmlSerial = new XmlSerializer(typeof(List<MyObject>)); 
    xmlSerial.Serialize(fileStrm, lstObjects); 
} 

但我在名單History得到System.InvalidOperationException。你有什麼建議嗎?

回答

2

DataPoints包含幾個不是(直接)可序列化的屬性,如顏色,字體,然後是一些。要麼爲這些類創建可序列化類型,要麼爲可完全序列化的DataPoint類創建序列化類型,或者如果只需要一個子集,則創建一個只包含顏色的int和兩個double值的可序列化類,可能是一個字符串對於名稱或提示..

這裏是一個序列化類的一個數據點的屬性的一個小子集的例子:

[Serializable] 
public class SPoint 
{ 
    public int PointColor { get; set; } 
    public double XValue { get; set; } 
    public double YValue { get; set; } 
    public string Name { get; set; } 

    public SPoint()  {  } 

    public SPoint(int c, double xv, double yv, string n) 
    { 
     PointColor = c; XValue = xv; YValue = yv; Name = n; 
    } 

    static public SPoint FromDataPoint(DataPoint dp) 
    { 
     return new SPoint(dp.Color.ToArgb(), dp.XValue, dp.YValues[0], dp.Name); 
    } 

    static public DataPoint FromSPoint(SPoint sp) 
    { 
     DataPoint dp = new DataPoint(sp.XValue, sp.YValue); 
     dp.Color = Color.FromArgb(sp.PointColor); 
     dp.Name = sp.Name; 
     return dp; 
    } 
} 

使用方法如下:

using System.Xml.Serialization; 
... 
... 
var points = chart.Series[0].Points; 

List<SPoint> sPoints = points.Cast<DataPoint>() 
          .Select(x => SPoint.FromDataPoint(x)) 
          .ToList(); 

XmlSerializer xs = new XmlSerializer(sPoints.GetType()); 
using (TextWriter tw = new StreamWriter(@"yourfilename.xml")) 
{ 
    xs.Serialize(tw, sPoints); 
    tw.Close(); 
} 

當然反序列化不會他一樣向後:

using (TextReader tw = new StreamReader(@"yourfilename.xml")) 
{ 
    //chart.Series[0].Points.Clear(); 
    //sPoints.Clear(); 
    sPoints = (List<SPoint>)xs.Deserialize(tw); 
    tw.Close(); 
} 
foreach (var sp in sPoints) s.Points.Add(SPoint.FromSPoint(sp)); 
1

我創建了一個非常簡單的例子對你給定的問題。作爲相關示例,我將大部分代碼作爲相關示例,除了Data Point作爲列表實現之外。我能夠序列化XML。希望這可以幫助。

class Program 
{   
static void Main(string[] args) 
    { 
     Details details = new Details(); 
     details.ID = new Guid(); 
     details.Name = "testuser"; 
     details.Status = true; 
     details.History = new List<DataPoint>(); 
     details.History.Add(new DataPoint() {Name = "test"}); 
     details.History.Add(new DataPoint() { Name = "test1" }); 
     details.History.Add(new DataPoint() { Name = "test2" }); 
     details.History.Add(new DataPoint() { Name = "test3" }); 
     Serialize(details); 
     } 


private static void Serialize(Details details) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(Details)); 
     using (TextWriter writer = new StreamWriter(@"C:\Users\testuser\Desktop\Xml.xml")) 
     { 
      serializer.Serialize(writer, details); 
     } 
    } 
} 

public class Details 
{ 

    public Guid ID { get; set; } 

    public string Name { get; set; } 

    public bool Status { get; set; } 

    public List<DataPoint> History { get; set; } = new List<DataPoint>(); 

} 
public class DataPoint 
{ 
    public string Name { get; set; } 

}