2011-04-07 135 views
2

我想通过WCF服务将类传递给客户端。在那个类中,我使用了一个结构体。但是,我在客户端收到的值是:“System.Data.DataSet” 必须是我不明白的东西。 见我的结构(它只是一个字符串现在)c#在WCF方法中传递结构

namespace spine.datatypes 
{ 
[Serializable] 
public struct Tanga : IXmlSerializable 
{ 
    private string _value; 


    public Tanga(string value) 
    { 
     this._value = value; 
    } 

    public static implicit operator Tanga(string value) 
    { 
     return new Tanga(value); 
    } 

    public override string ToString() 
    { 
     return this._value; 
    } 

    // implement IXmlSerializable 
    public XmlSchema GetSchema() { return null; } 
    public void ReadXml(XmlReader reader) 
    { 
     _value = reader.ReadContentAsString(); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     writer.WriteValue(this._value.ToString()); 
    } 
} 

}

这是我的服务:

namespace webapplication.WCFservice.Recorder 
{ 

    [ServiceContract] 
    [XmlSerializerFormat] 
    public interface IWCFRecorder 
    { 
     [OperationContract] 
     TvRecorder getDedicatedJob(String recordername, String recorderip); 
    } 
} 

这是我通过类:

namespace spine.recorder.tv 
{ 

[Serializable()] 
[XmlRoot("Recorder")] 
public class TvRecorder 
{ 
    public int id { get; set; } 
    public Tanga name { get; set; } 
    public MyIpAddress ip { get; set; } 
    public int channel { get; set; } 
    public MyTimecode time_start { get; set; } 
    public MyTimecode duration { get; set; } 

    public TvRecorder() { } 

    public TvRecorder(int _id, Tanga _name, MyIpAddress _ip, int _channel, MyTimecode _time_start, MyTimecode _duration) 
    { 
     this.id = _id; 
     this.name = _name; 
     this.ip = _ip; 
     this.channel = _channel; 
     this.time_start = _time_start; 
     this.duration = _duration; 
    } 

} 
} 
+2

所以Tanga结构是DataContract的DataMember?你可以发布你的DataContract吗? – BrandonZeider 2011-04-07 13:12:27

回答

1

不幸的是,svcutil为同一模式生成DataContract类型和XmlSerializer类型类型。我建议你尝试使用额外的“/ serializer:XmlSerializer/useSerializerForFaults”切换到svcutil,看看是否能解决你的问题。它应该确保Tanga生成。

一般而言,对于架构导入产生DataContract类型,所有的架构中定义的类型必须包含在XSD的子集DCS支持,你可以在这里找到:

http://msdn.microsoft.com/en-us/library/ms733112.aspx

如果svcutil在指定“/ serializer:DataContractSerializer”时未能生成代理,那么最可能的解释是架构不符合DC一致性。当您使用svcutil时,您是否看到其他错误或警告?

在公共Web服务中使用DataSets(包括typed和untyped)和IXmlSerializables通常也是不好的做法。在这种情况下,似乎可能会导入这些困难。这里有一个快速链接,其他原因可能会导致问题:http://www.hanselman.com/blog/PermaLink,guid,d88f7539-10d8-4697-8c6e-1badb08bb3f5.aspx

虽然DataContractSerializer可以序列化IXmlSerializable类型,但是根本不能保证IXMLSerializable类型可以导入为数据契约。这是两个不同的概念。 IXmlSerializable类型可以自由提供它们自己的模式,因此它们可以提供不符合datacontract的模式,从而导致svcutil退回到XmlSerializer类型生成。

希望这会有所帮助。