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

をしかし、私はリストHistorySystem.InvalidOperationExceptionを取得します。私に助言してくれましたか?

答えて

2

DataPointには、色、フォントなどの(直接)シリアライズ可能でないいくつかのプロパティが含まれています。それらのシリアル化可能な型と完全にシリアル化可能なDataPointクラスを作成するか、サブセットのみが必要な場合はxの& y値の2倍の2倍の数値を含むシリアル化可能なクラスを作成します。ここでは名前やツールチップのための...

はのDataPointのプロパティの最小限のサブセットを持つ直列化可能クラスの例です。もちろん

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(); 
} 

[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 (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

私はあなたの質問に非常に簡単な例を作成しました。私は関連する例としてコードからほとんどの部分を取りましたが、リストとして実装されたデータポイントは除きます。私は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; } 

} 
関連する問題