代码之家  ›  专栏  ›  技术社区  ›  Perpetualcoder

如何使用WCF发送复杂对象?它起作用了吗?这样好吗?

  •  1
  • Perpetualcoder  · 技术社区  · 16 年前

    我可以要一个这种形状的数据合同吗??

    [DataContract]
    
    public class YearlyStatistic{
    
    [DataMember]
    public string Year{get;set;}
    
    [DataMember]
    public string StatisticName {get;set;}
    
    [DataMember]
    public List<MonthlyStatistic> MonthlyStats {get;set}
    };
    

    我在这里假设类Monthlystatistic也需要是一个DataContract。在Web服务中可以这样做吗?

    3 回复  |  直到 15 年前
        1
  •  4
  •   Michael Kniskern    16 年前

    要对Web服务使用相同的模型,请将类标记为可序列化,请使用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; } 
    }
    

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

        2
  •  1
  •   Mike_G    16 年前

    是的,这就是标准的WCF序列化。您是想说MonthlyStats集合有一个名为WeeklyStats的属性,还是说每个MonthlyStatistic都有一个WeeklyStat集合?如果是前者,那么在WCF本地就不起作用。你得做些小动作才能让它工作。如果是后者,那就太好了。

        3
  •  1
  •   floatingfrisbee    15 年前

    是的,您可以从WCF服务来回发送上面提到的数据协定。如您所说,Monthlystatic及其所有成员必须定义为数据契约本身或内置类型(如字符串)。

    您甚至可以发送和接收更复杂的类型,例如,当您有一个基类,但想要发送或接收一个派生类的对象时(您可以使用knownType属性来这样做)。当从javascript接收(反序列化)时,有一个技巧需要使用它来指定wcf的类型。如果你感兴趣,可以问。

    推荐文章