2

我有一个简单的类,如下所示:

[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);

这仍然给出了同样的例外。我错过了什么?

4

2 回答 2

1

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

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

于 2018-11-29T16:04:58.223 回答
0

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

如果是这种情况,第二件要检查的事情是生成的序列化对象的大小。根据BrokeredMessageProperties文档,每个单独的标头的大小限制为 342b,所有组合属性的大小限制为 64kb,整个消息的大小限制为 256kb。如果您超过其中任何一个,您还将获得 SerializationException:

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

于 2013-01-05T22:48:10.443 回答