我正在实现一个基于SignalR的系统,它将推送客户端事件,对于消息序列化,我希望使用MessagePack。当尝试实现消息传递时,我遇到了一个问题,SignalR无法在客户端上反序列化消息。
消息是多态的,用Union属性描述,标准的MessagePack序列化器序列化和反序列化消息没有问题,但是在Signal R的情况下,它失败了,出现了错误。
报告的错误是System。InvalidOperationException: Invalid Union data was detected.
在客户端上,序列化只在使用实际类时有效,如果我尝试使用接口或基类,则出现错误。
类
[DataContract()]
[MessagePackObject()]
[Union(0,typeof(EntityChangeEventMessage))]
public abstract class EntityEventMessage : IEntityEventMessage
{
}
[DataContract()]
[MessagePackObject()]
public class EntityChangeEventMessage : EntityEventMessage
{
#region PROPERTIES
/// <summary>
/// Gets entity id.
/// </summary>
[DataMember(Order = 1)]
[Key(1)]
public int EntityId
{
get; set;
}
/// <summary>
/// Gets event type.
/// </summary>
/// <remarks>
/// This value identifies database operation such as create,delete,update etc.
/// </remarks>
[DataMember(Order = 2)]
[Key(2)]
public int EventType
{
get; set;
}
/// <summary>
/// Gets entity type name.
/// </summary>
[DataMember(Order = 3)]
[Key(3)]
public string EntityType
{
get; set;
}
#endregion
}
[Union(0,typeof(EntityChangeEventMessage))]
public interface IEntityEventMessage
{
}
这行得通
connection.On("EntityEvent", (EntityChangeEventMessage d)
这行不通
connection.On("EntityEvent"(IEntityEventMessaged)
所以在一般情况下,看起来问题应该在Microsoft.AspNetCore.SignalR.Protocols.MessagePack库?有人成功实现过这样的功能吗?
目前SignalR不支持与MessagePack的多态性,更多信息在这里。