XmlSerializer和类型

时间:2014-10-11 01:36:40

标签: c# xml types xml-serialization

我有一个处理XML序列化的类。

public class DB
{
    public List<Connection> lstConnections { get; set; }
    static string sRootAttribute = "Connections";

public static DB LoadFromFile(string path)
{
    FileStream fs = null;
    DB db = null;

    try
    {
        fs = File.Open(path, FileMode.Open);
        var serializer = new XmlSerializer(typeof(DB), new XmlRootAttribute(sRootAttribute));
        db = (DB)serializer.Deserialize(fs);
    }
    catch
    {

    }

    if (fs != null)
    {
        fs.Close();
    }

    return db;
}

public static void SaveToFile(string path, object objData)
{
    var fs = File.Open(path, FileMode.Create);
    var serializer = new XmlSerializer(objData.GetType(), new XmlRootAttribute(sRootAttribute));

    try
    {
        serializer.Serialize(fs, objData);
    }
    catch
    {

    }

    fs.Close();
}

}

LoadFromFile方法有些通用,因为它不考虑序列化数据类型 但是,SaveToFile对要序列化的对象执行GetType 因此,当我尝试使用LoadFromFile反序列化文件时,我遇到了问题。我没有得到任何例外,但lstConnections是空的。

1 个答案:

答案 0 :(得分:0)

如果您拥有Connection类的所有权,那么:

  1. 使用 [System.SerializableAttribute()] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 装饰Connection类。
  2. 使用 [System.Xml.Serialization.XmlArrayItemAttribute(&#34; connection&#34;,IsNullable = false)] 装饰连接列表属性。虽然我猜你会更安全地拥有一个阵列和一个不会自动实现的属性。
  3. 使用以下内容装饰DB类: [System.SerializableAttribute()] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] [ System.Xml.Serialization.XmlRootAttribute(Namespace =&#34;&#34;,IsNullable = false)]
  4. 返回基元类型的Connection的所有公共属性将自动序列化。除非您使用 [System.Xml.Serialization.XmlAttributeAttribute()] 专门修饰它们,否则它们将被序列化为属性。
  5. 您还必须同样处理Connection的非原始返回类型属性的序列化。使用 XmlArrayItemAttribute 装饰返回集合的属性,并将每个自定义子类型标记为可序列化。