2014-10-11 68 views
0

我有一個處理XML序列化的類。XmlSerializer和類型

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是空的。

+0

由'Xsd2Code'生成的代碼有一堆[控制XML序列化的屬性](http://msdn.microsoft.com/en-us/library/83y7df3e(v = vs.110).aspx )。我想串行器依賴於一些像'System.Xml.Serialization.XmlArrayAttribute'這樣的屬性來完成這項工作。 – kennyzx 2014-10-11 13:17:39

回答

0

如果你有超過Connection類的所有權,那麼:

  1. 裝飾連接類[System.SerializableAttribute()][System.Xml.Serialization.XmlTypeAttribute(AnonymousType =真) ]
  2. [System.Xml.Serialization.XmlArrayItemAttribute(「connection」,IsNullable = false)]裝飾連接列表屬性。雖然我猜你會更安全一些數組和屬性,但不會自動實現。
  3. 裝飾DB類與:[System.SerializableAttribute()][System.Xml.Serialization.XmlTypeAttribute(AnonymousType =真)][System.Xml.Serialization.XmlRootAttribute(命名空間= 「」 ,IsNullable = false)]
  4. 返回原語類型的Connection的所有公共屬性都會自動序列化。除非你專門用[System.Xml.Serialization.XmlAttributeAttribute()]修飾它們,否則它們將被序列化爲屬性。
  5. 您還必須類似地處理Connection的非基元返回類型屬性的序列化。使用XmlArrayItemAttribute裝飾返回集合的屬性,並將每個自定義子類型標記爲可序列化。
相關問題