DataContract
ある時点で、に送信するために、、DataMember
などの属性を持つクラスが必要になりますDataContactSerializer
。ただし、それらをPOCOに追加する必要はありません。
1つのオプションは、POCOと同じデータを入力するDTOを作成することです。このDTOは、でラップしますBrokeredMessage
。または、POCOを何らかの方法でシリアル化して、Stream
に与えることもできます。BrokeredMessage
別の方法は、.NETシリアル化で「サロゲート」と呼ばれるものを使用することです(DTOとほぼ同じです)。これには、サロゲートを定義するだけでなく、IDataContractSurrogate
を手動で作成するときに使用する実装も定義する必要がありますDataContractSerializer
。
まず、あなたが実際に持っているのは、あなたが投稿したプライベートフィールドを持つPOCOではなく、パブリックプロパティを持つPOCOであると仮定します。これで、サロゲートを作成できます。
[DataContract(Name = "CustomerOrderEvent", Namespace = "http://www.mynamespace.com")]
public class CustomerOrderEventSurrogate
{
[DataMember]
public int OrderId { get; set; }
[DataMember]
public int Quantity { get; set; }
[DataMember]
public double Value { get; set; }
}
...簡単です。この例では、必要なすべての属性を備えたPOCOと同じです。次に、IDataContractSurrogate
実装を定義します。
public class DataContractSurrogate : IDataContractSurrogate
{
public Type GetDataContractType(Type type)
{
if (typeof (CustomerOrderEvent).IsAssignableFrom(type))
{
return typeof (CustomerOrderEventSurrogate);
}
return type;
}
public object GetObjectToSerialize(object obj, Type targetType)
{
var customerOrderEvent = obj as CustomerOrderEvent;
if (customerOrderEvent == null) return obj;
var surrogate =
new CustomerOrderEventSurrogate
{
OrderId = customerOrderEvent.OrderId,
Quantity = customerOrderEvent.Quantity,
Value = customerOrderEvent.Value
};
return surrogate;
}
public object GetDeserializedObject(object obj, Type targetType)
{
var surrogate = obj as CustomerOrderEventSurrogate;
if (surrogate == null) return obj;
var customerOrderEvent =
new CustomerOrderEvent()
{
OrderId = surrogate.OrderId,
Quantity = surrogate.Quantity,
Value = surrogate.Value
};
return customerOrderEvent;
}
public object GetCustomDataToExport(MemberInfo memberInfo, Type dataContractType)
{
throw new NotImplementedException();
}
public object GetCustomDataToExport(Type clrType, Type dataContractType)
{
throw new NotImplementedException();
}
public void GetKnownCustomDataTypes(Collection<Type> customDataTypes)
{
throw new NotImplementedException();
}
public Type GetReferencedTypeOnImport(string typeName, string typeNamespace, object customData)
{
throw new NotImplementedException();
}
public CodeTypeDeclaration ProcessImportedType(CodeTypeDeclaration typeDeclaration, CodeCompileUnit compileUnit)
{
throw new NotImplementedException();
}
}
ここではNotImplementedException
、オプションのメソッドをスローします。この実装は、シリアル化時にサポートし、代わりに使用するGetDataContractType
ことを呼び出し元に通知するために実装されます。また、サロゲートからPOCOへの実装とマッピングも行います。CustomerOrderEvent
CustomerOrderEventSurrrogate
GetObjectToSerialize
GetDeserializeObject
ここで、使用する実装を認識BrokeredMessage
しているDataContractSerializer
インスタンスを使用してを作成するだけです。IDataContractSurrogate
例えば:
var customerOrderEvent = new CustomerOrderEvent
{
OrderId = 1,
Quantity = 1,
Value = 1.99
};
var dataContractSerializer =
new DataContractSerializer(typeof (CustomerOrderEvent),
new[] {typeof (CustomerOrderEvent)},
int.MaxValue,
true,
true,
new DataContractSurrogate());
var message = new BrokeredMessage(customerOrderEvent, dataContractSerializer);
また、メッセージを受信したら、DataContractSerializer
オブジェクトをGetBody
メソッドに渡すことができます。例えば:
message.GetBody<CustomerOrderEvent>(dataContractSerializer);
...これは、会話のこちら側が他の側とすべて同じことを行っていることを前提としています(代理クラス、IDataContractSurrogate
実装を持ち、dataContractSerializer
適切に作成されています)。