无法使用XML Serializer序列化Dictionary

时间:2015-04-07 02:18:42

标签: c# serialization

序列化此类时遇到问题。我确保所有类组件类都是公共的,并确保每个类变量中都有非空值。我有什么理由不能将其序列化吗?

例外:

  

未处理的类型' System.InvalidOperationException'发生在System.Xml.dll中   附加信息:有一个错误反映了类型&Some39Space.TmpClass。

以下是代码:

public class TmpClass : ICloneable
{
    public List<string> str_pattern { get; set; } 
    public int group { get; set; }
    public double tp { get; set; }
    public double sl { get; set; }
    public int index { get; set; }
    public int num { get; set; }
    public string direction { get; set; }
    public string open;
    public string close;

    public TmpClass ()
    {
        open= "NA";
        close= "NA";
        direction  = "NA";
    }
    public Dictionary<string, SomeClass> stats = new Dictionary<string, SomeClass>();

    // Serialize Data
    public void Save(string fileName, string location)
    {
        string file = string.Concat(location, fileName);
        using (var stream = new FileStream(file, FileMode.Create))
        {
            XmlSerializer XML = new XmlSerializer(typeof(TmpClass));
            XML.Serialize(stream, this);
        }
    }

    // Deserialize Data
    public static TmpClass Load(string fileName, string location)
    {
        string file = string.Concat(location, fileName);
        using (var stream = new FileStream(file, FileMode.Open))
        {
            XmlSerializer XML = new XmlSerializer(typeof(TmpClass));
            return (TmpClass)XML.Deserialize(stream);
        }
    }

    //
    public object Clone()
    {
        return this.MemberwiseClone();
    }
}

以下是例外:

String Index: 1
System.InvalidOperationException: There was an error reflecting type 'StringBui
lder.String'. ---> System.NotSupportedException: Cannot serialize member Patter
nBuilder.String.stats of type System.Collections.Generic.Dictionary`2[[System.S
tring, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e0
89],[StringBuilder.SomeClass, StringBuilder, Version=1.0.0.0, Cultu
re=neutral, PublicKeyToken=null]], because it implements IDictionary.
   at System.Xml.Serialization.TypeScope.GetDefaultIndexer(Type type, String mem
berInfo)
   at System.Xml.Serialization.TypeScope.GetCollectionElementType(Type type, Str
ing memberInfo)
   at System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo me
mberInfo, Boolean directReference)
   at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo sourc
e, Boolean directReference, Boolean throwOnError)
   at System.Xml.Serialization.StructModel.GetFieldModel(FieldInfo fieldInfo)
   at System.Xml.Serialization.StructModel.GetFieldModel(MemberInfo memberInfo)
   at System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(Str
uctMapping mapping, StructModel model, Boolean openModel, String typeName, Recur
sionLimiter limiter)
   at System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(Str
uctModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter
limiter)
   at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel
 model, String ns, ImportContext context, String dataType, XmlAttributes a, Bool
ean repeats, Boolean openModel, RecursionLimiter limiter)
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel
 model, String ns, ImportContext context, String dataType, XmlAttributes a, Bool
ean repeats, Boolean openModel, RecursionLimiter limiter)
   at System.Xml.Serialization.XmlReflectionImporter.ImportElement(TypeModel mod
el, XmlRootAttribute root, String defaultNamespace, RecursionLimiter limiter)
   at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultName
space)
   at StringBuilder.String.Save(String fileName, String location) in c:\Users\
Wei\Dropbox\Work\Personal\CS\StringBuilder\Data.cs:line 133
   at StringBuilder.Program.Main(String[] args) in c:\Users\Wei\Dropbox\Work\Pe
rsonal\CS\StringBuilder\Program.cs:line 48

0 个答案:

没有答案