3
A
回答
7
已知的類型屬性被傳遞給DataContractSerializer構造函數。您可以customize the way this serializer is instantiated並通過反射您的程序集並查找從基類派生的所有類型,爲序列化程序的constructor提供已知類型。
下面是一個示例代碼(未測試):
[ServiceContract]
public interface FooContract
{
[OperationContract]
[KnownTypesDataContractFormat(typeof(SomeBaseType))]
void MyOperation(SomeBaseType arg);
}
public class KnownTypesDataContractFormatAttribute : Attribute, IOperationBehavior
{
public Type BaseType { get; private set; }
public KnownTypesDataContractFormatAttribute(Type baseType)
{
BaseType = baseType;
}
public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters)
{ }
public void ApplyClientBehavior(OperationDescription description, System.ServiceModel.Dispatcher.ClientOperation proxy)
{
IOperationBehavior innerBehavior = new KnownTypesDataContractSerializerOperationBehavior(description, BaseType);
innerBehavior.ApplyClientBehavior(description, proxy);
}
public void ApplyDispatchBehavior(OperationDescription description, System.ServiceModel.Dispatcher.DispatchOperation dispatch)
{
IOperationBehavior innerBehavior = new KnownTypesDataContractSerializerOperationBehavior(description, BaseType);
innerBehavior.ApplyDispatchBehavior(description, dispatch);
}
public void Validate(OperationDescription description)
{ }
}
public class KnownTypesDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior
{
public Type BaseType { get; private set; }
public KnownTypesDataContractSerializerOperationBehavior(OperationDescription operationDescription, Type baseType) : base(operationDescription)
{
BaseType = baseType;
}
public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes)
{
return new DataContractSerializer(type, name, ns, knownTypes);
}
public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
{
return new DataContractSerializer(type, name, ns, knownTypes);
}
private IEnumerable<Type> GetKnownTypes()
{
// Try to find all types that derive from BaseType in the
// executing assembly and add them to the knownTypes collection
return
from type in Assembly.GetExecutingAssembly().GetTypes()
where type != BaseType && BaseType.IsAssignableFrom(type)
select type;
}
}
相關問題
- 1. WCF服務已知類型的對象將不會返回已知類型的屬性
- 2. wcf服務中的ServiceHost指令中的服務類型問題
- 3. WCF:配置已知類型
- 4. WCF已知類型錯誤
- 5. WCF數據服務的性能問題
- 6. WCF服務問題
- 7. WCF服務問題
- 8. WCF服務問題
- 9. WCF服務問題
- 10. 已知類型序列化問題
- 11. XmlSerializer InvalidOperationExc - 已知問題轉換類型
- 12. 繼承和已知類型問題
- 13. WCF服務和屬性
- 14. WCF服務 - 向後兼容性問題
- 15. WCF服務間歇性問題
- 16. 問題與WCF Ria服務需要角色屬性
- 17. WCF - 複雜對象 - 已知類型
- 18. 關於類屬性類型的WCF
- 19. WCF服務類型別名
- 20. WCF服務共享類型
- 21. 調試WCF服務問題
- 22. WCF服務httpcfg問題
- 23. WCF服務設計問題
- 24. WCF問題 - 公開服務
- 25. Sharepoint 2010 WCF服務問題
- 26. jQuery和WCF服務問題
- 27. wcf雙工服務問題
- 28. WCF - 已知類型與客戶端和服務器之間的共享類類型
- 29. ASP.NET服務器控件屬性問題(?)
- 30. 使用ICollection的屬性與WCF服務
我很抱歉我在WCF漂亮燈芯,如何使這上不是每個方法整個服務? – 2009-07-13 19:29:04