Пользовательские настройки XML сериализация объекта - PullRequest
0 голосов
/ 17 июля 2009

Я пытаюсь сохранить пользовательский объект в качестве пользовательской настройки в приложении VB.net. Этот объект состоит из списка (Of Pair (Of String, Object)). Pair - это пользовательский класс, который имеет два свойства чтения / записи (String и Object).

Если я добавлю простые типы, такие как int, string, datetime, как второе значение в моей паре, настройка будет сохранена без проблем. Но если я пытаюсь поместить что-то более сложное, например, список, во время сериализации возникает проблема, и мои настройки не сохраняются.

Строковые значения в моих парах сериализуются следующим образом:

<value1>Priority_1</value1>

Значения объекта сериализуются со специальным атрибутом:

<value2 xsi:type="xsd:int">2</value2>

Похоже, что значения типа Object сериализуются по-разному, чтобы «запомнить», что является реальным типом объекта. Почему он не может сделать то же самое для более сложных типов, таких как List (Of T)?

Можете ли вы придумать какой-нибудь простой обходной путь? Любые советы о сериализации XML, которые могут мне помочь, также приветствуются: -)

1 Ответ

1 голос
/ 17 июля 2009

Он может сделать это для int, хранящегося в объекте, потому что он знает, как сериализовать int. он не знает, как сериализовать ваш сложный тип.

Если вы не используете атрибут [XmlInclude] , чтобы сообщить ему, какие типы могут появляться в этом объекте. Из примера:

   [WebMethod()]
   [XmlInclude(typeof(Car)), XmlInclude(typeof(Bike))]
   public Vehicle Vehicle(string licenseNumber) {
      if (licenseNumber == "0") {
         Vehicle v = new Car();
         v.licenseNumber = licenseNumber;
         return v;
      }
      else if (licenseNumber == "1") {
          Vehicle v = new Bike();
          v.licenseNumber = licenseNumber;
          return v;
      }
      else {
         return null;
      }
   }

, где

[XmlRoot("NewVehicle")] 
public abstract class Vehicle {
    public string licenseNumber;
    public DateTime make;
}

public class Car : Vehicle {
}

public class Bike : Vehicle {
}
...