UWP XmlSerializer - 从派生到基类的对象的反序列化

时间:2016-08-04 15:56:10

标签: c# serialization xml-serialization

所以我有2节课。第一个类是Message,第二个类是MessageText类,它派生自Message类。

这是消息类

public class Message
{
    public Message(Guid from, Guid to, MessageType type, DateTime sentAt)
    {
        From = from;
        To = to;
        Type = type;
        SentAt = sentAt;
    }

    public Message()
    {
    }

    public Guid From { get; set; }
    public Guid To { get; set; }
    public MessageType Type { get; set; }
    public DateTime SentAt { get; set; }
}

这是 MessageText类

public class MessageText : Message
{
    public MessageText(Guid from, Guid to, MessageType type, DateTime sentAt, string text)
        : base(from, to, type, sentAt)
    {
        this.Text = text;
    }

    public MessageText()
    {
    }

    public string Text { get; set; }
}

这就是我进行序列化和反序列化的方法:

    public static byte[] ConvertToStream(object obj)
    {
        try
        {
            XmlSerializer bf = new XmlSerializer(obj.GetType());

            using (MemoryStream ms = new MemoryStream())
            {
                bf.Serialize(ms, obj);
                return ms.ToArray();
            }
        }
        catch { return new byte[0]; }
    }

    public static object ConvertFromStream<T>(byte[] data)
    {
        try
        {
            XmlSerializer bf = new XmlSerializer(typeof(T));
            using (MemoryStream ms = new MemoryStream(data))
            {
                return bf.Deserialize(ms);
            }
        }
        catch { return null; }
    }

我如何使用这些方法:

Byte[] buffer = XMLHelper.ConvertToStream(message);
// Now send the message
// ...
/// When I receive the message
Message msg = (Message)XMLHelper.ConvertFromStream<Message>(data);
switch (msg.Type)
        {
            case EMessageType.Text:
                if (OnMessageTextReceivedEvent != null)
                {
                    MessageText msgT = (MessageText)XMLHelper.ConvertFromStream(data);
                    OnMessageTextReceivedEvent(msgT, EventArgs.Empty);
                }
                break;
        //...
        }

因此,当我收到消息时,我首先要将它反序列化为基类,以便我可以看到它是什么类型的消息,然后将其反序列化为正确的类型。

注意:如果我想反序列化为正确的类型,我可以使用这种方法,例如,如果我将MessageText对象反序列化为MessageText对象,但是如果我尝试反序列化MessageText对象到它的基类我得到以下错误:“XML文档中存在错误(2,2)。”

1 个答案:

答案 0 :(得分:0)

由于XmlSerializer需要root元素并且MessageText类的根元素是我只需使用以下代码来更改MessageText类的根元素,现在我可以将对象反序列化为Message和/或MessageText类。

[XmlRoot("Message")]
public class MessageText : Message
{
    public MessageText(Guid from, Guid to, MessageType type, DateTime sentAt, string text)
        : base(from, to, type, sentAt)
    {
        this.Text = text;
    }

    public MessageText()
    {
    }

    public string Text { get; set; }
}