UWP XmlSerializer - 对象从派生到基的反序列化 class
UWP XmlSerializer - Deserialization of an object from a derived to base class
所以我有 2 个 classes。第一个 class 是 Message,第二个是从 Message class.
派生的 MessageText class
这是消息class:
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 class:
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;
//...
}
所以当我收到消息时,我首先想将其反序列化为基础class,以便我可以看到它是什么类型的消息,然后将其反序列化为正确的类型。
注意:如果我想反序列化为正确的类型,我可以毫无问题地使用这种方法,例如,如果我将 MessageText 对象反序列化为 MessageText 对象,但是如果我尝试将 MessageText 对象反序列化到其基数 class 我收到以下错误:"There is an error in XML document (2, 2)."
由于 XmlSerializer 期望根元素是 MessageText 的根元素 class 我只是使用以下代码更改 MessageText 的根元素 class 现在我可以将对象反序列化为 Message and/or MessageText class.
[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; }
}
所以我有 2 个 classes。第一个 class 是 Message,第二个是从 Message class.
派生的 MessageText class这是消息class:
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 class:
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;
//...
}
所以当我收到消息时,我首先想将其反序列化为基础class,以便我可以看到它是什么类型的消息,然后将其反序列化为正确的类型。
注意:如果我想反序列化为正确的类型,我可以毫无问题地使用这种方法,例如,如果我将 MessageText 对象反序列化为 MessageText 对象,但是如果我尝试将 MessageText 对象反序列化到其基数 class 我收到以下错误:"There is an error in XML document (2, 2)."
由于 XmlSerializer 期望根元素是 MessageText 的根元素 class 我只是使用以下代码更改 MessageText 的根元素 class 现在我可以将对象反序列化为 Message and/or MessageText class.
[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; }
}