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

古いBrokeredMessageタイプにある「Properties」コレクションの代わりに「UserProperties」を持つ新しいServiceBusメッセージタイプで同様のエラーが発生した結果、ここに到着しました。ここでドキュメントを読むと、ユーザープロパティとして追加できるサポートされているタイプの限定されたセットがあります。おそらく、同じルールが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 Service Busクォータに示されているように、各プロパティの最大サイズは32Kです。すべてのプロパティの累積サイズは64Kを超えることはできません。これは、ユーザープロパティとシステムプロパティ(SequenceNumber、Label、MessageIdなど)の両方を持つBrokeredMessageのヘッダー全体に適用されます。プロパティが占めるスペースは、メッセージの全体的なサイズと最大サイズの256Kにカウントされます。アプリケーションが上記の制限のいずれかを超えると、SerializationException例外が生成されるため、このエラー状態を処理することを期待する必要があります。

于 2013-01-05T22:48:10.443 に答える