在某些时候,您必须有一个带有 , 等属性的类DataContract
才能DataMember
发送到DataContactSerializer
. 但是,您不必将它们添加到您的 POCO。
一种选择是简单地创建一个 DTO,使用与 POCO 相同的数据填充该 DTO。这个 DTO 你会用BrokeredMessage
. 或者,您可以简单地将您的 POCO 以某种方式序列化为 aStream
并将其提供给 aBrokeredMessage
另一种方法是使用 .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
告诉调用者它支持CustomerOrderEvent
并CustomerOrderEventSurrrogate
在序列化时使用。它还实现GetObjectToSerialize
了GetDeserializeObject
从代理到 POCO 的来回映射。
现在,您只需创建一个知道您要使用的实现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
正确创建。)