2012-02-17 2 views
1

У меня есть класс, содержащий SortedList<string, Data> как частное поле, где Data является простым пользовательским классом с некоторыми int, DateTime и Nullable<DateTime> полеем.Сериализация пользовательского класса XML

public class CustomCollection 
{ 
    private SortedList<string, Data> _list; 

    ... 
} 

Теперь я хотел бы сделать мой класс сериализации, так что я мог бы написать его содержание (т.е. пунктов _list поля) в файле XML или загрузки данных из существующего файла XML.

Как я могу продолжить?

Я думаю, что я понимаю, что существует два способа сериализации: первый должен пометить все поля как сериализуемые, а второй - реализовать интерфейс IXmlSerializable. Если я правильно понимаю, когда я могу использовать каждый из двух способов?

+0

Вы хотите загрузить xml-представление _list из xml-файла и сохранить его в xml-файле? –

+0

@ Ricky.G: Да, как _load from_, так и _save to_ XML-файл. – enzom83

+2

http://msdn.microsoft.com/en-us/magazine/cc164135.aspx может помочь. Я напишу вам источник тестов, когда у меня будет время. – findcaiyzh

ответ

4

Хорошо, вам просто нужно украсить свои классы с помощью атрибута [Serializable], и ​​он должен работать. Однако у вас есть SortedList, который реализует в IDictionary и они не могут быть сериализован с IXmlSerializable так нужно сделать немного настройки смотрите здесь

Serializing .NET dictionary

, но если вы измените свой упорядоченный список в нормальный список или что-нибудь, что не реализует IDictionary, тогда приведенный ниже код будет работать :-) скопируйте его в консольное приложение и запустите его.

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Data d = new Data { CurrentDateTime = DateTime.Now, DataId = 1 }; 
      Data d1 = new Data { CurrentDateTime = DateTime.Now, DataId = 2 }; 
      Data d2 = new Data { CurrentDateTime = DateTime.Now, DataId = 3 }; 

      CustomCollection cc = new CustomCollection 
             {List = new List<Data> {d, d1, d2}}; 

      //This is the xml 
      string xml = MessageSerializer<CustomCollection>.Serialize(cc); 

      //This is deserialising it back to the original collection 
      CustomCollection collection = MessageSerializer<CustomCollection>.Deserialize(xml); 
     } 
    } 

    [Serializable] 
    public class Data 
    { 
     public int DataId; 
     public DateTime CurrentDateTime; 
     public DateTime? CurrentNullableDateTime; 
    } 

    [Serializable] 
    public class CustomCollection 
    { 
     public List<Data> List; 
    } 

    public class MessageSerializer<T> 
    { 
     public static T Deserialize(string type) 
     { 
      var serializer = new XmlSerializer(typeof(T)); 

      var result = (T)serializer.Deserialize(new StringReader(type)); 

      return result; 
     } 

     public static string Serialize(T type) 
     { 
      var serializer = new XmlSerializer(typeof(T)); 
      string originalMessage; 

      using (var ms = new MemoryStream()) 
      { 
       serializer.Serialize(ms, type); 
       ms.Position = 0; 
       var document = new XmlDocument(); 
       document.Load(ms); 

       originalMessage = document.OuterXml; 
      } 

      return originalMessage; 
     } 
    } 
} 
+0

Я думаю, что один из способов последовательного чтения всех элементов в SortedList перечисляет их один за другим с помощью 'foreach (KeyValuePair kvp in _list) {// сериализуем элемент}' – enzom83

+1

вы можете реализовать свой собственный словарь который расширяет существующее и сериализуется, посмотрите здесь http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx –

Смежные вопросы