如果消息能够指定其类型,那将非常有帮助。否则,您需要从某个属性或另一个属性中推断出它的类型。
在序列化时,您可以使用消息包装类,例如:
public class MessageWrapper<T>
{
public string MessageType { get { return typeof(T).FullName; } }
public T Message { get; set; }
}
如果您有一个包含First
和Last
属性的Name
类,您可以像下面这样进行序列化:
var nameMessage = new MessageWrapper<Name>()
nameMessage.Message = new Name {First="Bob", Last = "Smith"}
var serialized = JsonConvert.SerializeObject(nameMessage)
序列化后的JSON数据为:
{"MessageType":"YourAssembly.Name","Message":{"First":"Bob","Last":"Smith"}}
反序列化时,首先将 JSON 反序列化为此类型:
public class MessageWrapper
{
public string MessageType { get; set; }
public object Message { get; set; }
}
var deserialized = JsonConvert.DeserializeObject<MessageWrapper>(serialized);
从
MessageType
属性中提取消息类型。
var messageType = Type.GetType(deserialized.MessageType)
现在你已经知道了类型,你可以对 Message
属性进行反序列化。
var message = JsonConvert.DeserializeObject(
Convert.ToString(deserialized.Message), messageType)
message
是一个object
,但你可以将它转换为Name
或者它实际所属的类。