C#序列化包含更多列表的对象列表
问题描述:
我在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
。你有什么建议吗?
答
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));
答
我创建了一个非常简单的例子对你给定的问题。作为相关示例,我将大部分代码作为相关示例,除了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; }
}