2014-10-11 3 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

ответ

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. Вы также должны обрабатывать сериализацию для не примитивных свойств возвращаемого типа соединения. Украсьте свойства, возвращающие коллекции с XmlArrayItemAttribute и отметьте каждый пользовательский подтип как сериализуемый.
Смежные вопросы