Вопрос

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

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»

Это было полезно?

Решение

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

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

XmlSerializer serializer = new XmlSerializer(instance.GetType())

Другие советы

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

Учитывая следующий код:

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top