XMLSerialization в C # - PullRequest
       45

XMLSerialization в C #

2 голосов
/ 13 сентября 2008

У меня есть простой тип, который явно реализует интерфейс.

public interface IMessageHeader
{
    string FromAddress { get; set; }
    string ToAddress   { get; set; }
}

[Serializable]
public class MessageHeader:IMessageHeader
{
  private string from;
  private string to;

  [XmlAttribute("From")]
  string IMessageHeade.FromAddress
  {
    get { return this.from;}
    set { this.from = value;}
  }

 [XmlAttribute("To")]
 string IMessageHeade.ToAddress
 {
    get { return this.to;}
    set { this.to = value;}
 }
}

Есть ли способ сериализации и десериализации объектов типа IMessageHeader ??

Я получил следующую ошибку при попытке

«Невозможно сериализовать интерфейс IMessageHeader»

Ответы [ 5 ]

3 голосов
/ 13 сентября 2008

Вы не можете сериализовать IMessageHeader, потому что вы не можете выполнить Activator.CreateInstance (typeof (IMessageHeader)), что и будет делать сериализация под прикрытием. Вам нужен конкретный тип.

Вы можете сделать typeof (MessageHeader) или вы можете сказать, иметь экземпляр MessageHeader и делать

XmlSerializer serializer = new XmlSerializer(instance.GetType())
0 голосов
/ 13 сентября 2008

Проблема связана с тем, что вы не можете десериализовать интерфейс, но должны создавать конкретный класс.

Атрибут XmlInclude может использоваться, чтобы сообщить сериализатору, какие конкретные классы реализуют интерфейс.

0 голосов
/ 13 сентября 2008

Нет, потому что сериализатору нужен конкретный класс, который он может создать.

С учетом следующего кода:

XmlSerializer ser = new XmlSerializer(typeof(IMessageHeader));

IMessageHeader header = (IMessageHeader)ser.Deserialize(data);

Какой класс создает сериализатор для возврата из Deserialize ()?

Теоретически возможно сериализовать / десериализовать интерфейс, но только не с XmlSerializer.

0 голосов
/ 13 сентября 2008

Попробуйте добавить IXmlSerializable в ваше объявление IMessageHeader, хотя я не думаю, что это сработает.

Насколько я помню, сериализатор .net xml работает только для конкретных классов, имеющих конструктор по умолчанию.

0 голосов
/ 13 сентября 2008

Вы можете создать абстрактный базовый класс, реализующий IMessageHeader, а также наследующий MarshalByRefObject

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...