2008-09-12 4 views
2

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

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»

ответ

3

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

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

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

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

0

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

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

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

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

какого класс сериализатор создать для возвращения из десериализации()?

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

0

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

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

0

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

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