为什么序列化失败了"不支持的类型"当我尝试在BrokeredMessage属性中设置对象?

时间:2013-01-01 05:12:17

标签: servicebus azureservicebus

我有一个看起来像这样的简单类:

[DataContract]
public class Actor
{
    public string Email { get; set; }
    public string Name { get; set; }
    public Guid Id { get; set; }
}

我正在尝试将其作为BrokeredMessage中的属性发送,如下所示:

BrokeredMessage message = new BrokeredMessage(entity);
message.Properties["entityType"] = entity.GetType().Name;
message.Properties["action"] = action;
message.Properties["actor"] = actor;     // <-- This causes a failure
message.Properties["tenant"] = tenant;

topicClient.Send(message);

但我不断收到SerializationException消息 Serialization operation failed due to unsupported type Starlight.Events.Actor

我尝试提供自己的序列化程序,但没有帮助:

var knownTypes = new List<Type>();
knownTypes.Add(typeof(Actor));
var dcs = new DataContractSerializer(entity.GetType(), knownTypes);

BrokeredMessage message = new BrokeredMessage(entity, dcs);

这仍然提供相同的例外。我错过了什么?

2 个答案:

答案 0 :(得分:1)

您是否检查过DataContractSerializer是否能够正确序列化/反序列化Actor类是否可以自行序列化?

如果是这种情况,则要检查的第二件事是生成的序列化对象的大小。根据{{​​3}}文档,每个标题的大小限制为342b,所有组合属性为64kb,整个消息为256kb。如果你超过其中任何一个,你也会得到一个SerializationException:

  

如Windows Azure AppFabric Service Bus配额中所示,每个属性的最大大小为32K。所有属性的累积大小不能超过64K。这适用于BrokeredMessage的整个标头,它具有用户属性和系统属性(例如SequenceNumber,Label,MessageId等)。属性占用的空间计入消息的总大小,最大大小为256K。如果应用程序超出上述任何限制,则会生成SerializationException异常,因此您应该期望处理此错误情况。

答案 1 :(得分:0)

我到达这里是由于较新的ServiceBus消息类型出现类似错误,该消息类型具有“ UserProperties”,而不是较旧的BrokeredMessage类型上的“ Properties”集合。阅读文档here时,可以将有限类型的受支持类型添加为用户属性。也许相同的规则适用于BrokeredMessage用户属性。

  

备注:仅支持以下值类型:byte,sbyte,char,   short,ushort,int,uint,long,ulong,float,double,decimal,bool,   Guid,字符串,Uri,DateTime,DateTimeOffset,TimeSpan