2017-09-15 145 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; } 

} 
相关问题