在某些時候,你必須有一個類DataContract
,DataMember
等,其屬性發送到DataContactSerializer
。但是,您不必將它們添加到您的POCO中。
一種方法是簡單地創建一個DTO,並使用與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
來告訴調用者它支持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
。)