首先是代码:

[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/

10-11 02:13
查看更多