首先是代码:
[ServiceContract]
public interface IWorker
{
[OperationContract]
void Process(XmlElement data);
[OperationContract]
void Update(Rule rule);
}
[DataContract]
public class Rule
{
[OperationContract]
public string Expression { get; set; }
[OperationContract]
public List<IAction> Actions { get; set; }
}
public interface IAction
{
void Execute(XmlElement data);
}
调度程序将数据编码为xml,然后将其发送到IWorker实例,在该实例中对每个表达式进行求值。当IWorker实例将表达式评估为true时,将调用IAction.Execute并传递xml/data。
序列化Rule.Action的最佳方法是什么?我已经开始编写自定义序列化程序,但是我想看看是否有更简单的方法。
谢谢。
最佳答案
我不认为您可以在DataContracts中使用接口(interface)(如果我做错了,请纠正我,但我认为那也想尝试使用泛型)。我要做的是有一个父类,然后添加KnownType属性。例如
[DataContract]
public class Action
{
//members and properties
}
[DataContract]
public class SomeOtherAction:Action
{
//more implimentation
}
[DataContract]
[KnownType(typeof(SomeOtherAction))]
public class Rule
{
[DataMember]
List<Action> Actions{get;set;}
}
现在,您可以将从父Action对象继承的任何对象填充到Actions列表中,它将正确序列化它们各自的类属性(只要该对象被列为已知类型)。*我以“Action”名称为例来说明与您的名称相关,显然,Action是.NET中的关键字
关于wcf - 在WCF中基于接口(interface)序列化数组的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6932356/