如何使用WCF发送复杂对象?它有用吗?好吗?

时间:2009-04-02 17:51:58

标签: wcf data-binding datacontract

我可以拥有这种形状的数据合约吗?

[DataContract]

public class YearlyStatistic{

[DataMember]
public string Year{get;set;}

[DataMember]
public string StatisticName {get;set;}

[DataMember]
public List<MonthlyStatistic> MonthlyStats {get;set}
};

我在这里假设MonthStatistic类也需要是DataContract。你能在网络服务中做到这一点吗?

3 个答案:

答案 0 :(得分:4)

要对Web服务使用相同的模型,请将您的类标记为Serializable,并使用System.Xml.Serialization命名空间中的XmlRoot和XmlElement。以下是使用您的示例的示例:

[Serializable]
[XmlRoot("YearlyStatistic")]
public class YearlyStatistic
{
    [XmlElement("Year")]
    public string Year { get; set; }

    [XmlElement("StatisticName")]
    public string StatisticName { get; set; }

    [XmlElement("MonthlyStats")]
    public List<MonthlyStatistic> MonthlyStats { get; set; } 
}

您必须对父对象的复杂对象属性执行相同的操作。

答案 1 :(得分:1)

是的,这就是那里的标准WCF序列化。您是否想说MonthStats集合中有一个名为WeeklyStats的属性,或者每个MonthStatistic都有一个WeeklyStat集合?如果它是前者,那在WCF本身就不起作用。你必须做一些摆弄才能让它发挥作用。如果是后者,那就完全没问题了。

答案 2 :(得分:1)

是的,您可以从WCF服务来回发送您上面提到的数据合同。就像你说的那样,MonthlyStatistic及其所有成员必须自己定义为数据合约,或者以类型(如字符串)构建。

您甚至可以发送和接收更复杂的类型,例如当您拥有基类但希望发送或接收派生类的对象时(您将使用KnownType属性执行此操作)。从Javascript接收(反序列化)时,有一个技巧,您必须使用它来指定WCF的类型。如果您有兴趣,请随时提出。