我有一個WCF服務,它具有可以接收任何.net序列化客戶端數據的操作。WCF抑制某些操作實現參數的反序列化
[OperationContract]
void SaveMyData(long id, string name, object serializableData);
[OperationContract]
object LoadMyData(long id, string name);
服務器不需要知道數據是什麼,它只是存儲它或返回存儲的內容。而且服務器甚至不知道被序列化的類型,所以當然這個合約會導致反序列化異常。
我知道我可以序列化/反序列化獨立合同的WCF,例如:
[OperationContract]
void SaveMyData(long id, string name, byte[] serializedData);
[OperationContract]
byte[] LoadMyData(long id, string name);
但是這需要在客戶端上額外的代碼序列化和反序列化。我想避免這種情況,並儘可能簡化客戶端代碼。
我知道我可以在客戶端DLL中創建一個預生成代理,它將包裝WCF調用並執行附加的序列化/反序列化。但我寧願能夠依賴從WSDL生成的客戶端。
理想情況下,RawAttribute
可以放在參數或返回值上,以抑制序列化/反序列化(通用根object
類型),而不是提供或期望一個(對象)byte [](或(object)Stream? )從操作。
[OperationBehavior]
public void SaveMyData(long id, string name, [Raw] object serializableData){ ... }
[OperationContract, Raw]
object LoadMyData(long id, string name);
我已經看了DataContractSurrogate
和DataContractResolver
,但我沒有看到如何實現這一目標。 DataContractSurrogate
在反序列化管道中似乎太晚了,因爲已經提供了類型和反序列化對象。解析器不提供數據,只是類型信息。它們都沒有提供關於參數被反序列化的信息,以便找到RawAttribute
。
WCF是否爲此提供了適當的可擴展性?還是內置的方式?
我也想知道從序列化數據中提取的聲明類型是什麼,但這不是必需的。
謝謝!
Carlos已經寫了一系列WCF擴展點[這裏](http://blogs.msdn.com/b/carlosfigueira/archive/2011/03/14/wcf-extensibility.aspx),特別是圍繞序列化[這裏](http://blogs.msdn.com/b/carlosfigueira/archive/2011/08/30/wcf-extensibility-serialization.aspx) –