构造函数没有出现在我的WCF客户端,序列化问题?

时间:2008-11-18 17:17:50

标签: c# wcf serialization

我的WCF服务中有一个简单的类,对于访问我的WCF的客户端似乎没有正确显示。

我的类有4个类型为string的公共属性。

我使用[DataContract()]标记了类,并使用[DataMember]标记了每个成员。

为什么我的构造函数不可见?构造函数是否有特殊的[属性]?

4 个答案:

答案 0 :(得分:8)

数据协定与构造函数无关。因此,当您在客户端上创建代理时,您将只获得一个实现数据协定的类。

如果要在客户端添加类似的构造函数(假设生成的类型名为SomeDataItem),则可以使用分部类添加它:

public partial class SomeDataItem
{
    public SomeDataItem(int a, int b)
    {
        A = a;
        B = b;
    }
}

答案 1 :(得分:6)

同意您可以将部分类添加到WCF客户端应用程序 - 您还可以将[OnDeserializing]和[OnDeserialized]方法添加到服务器端类以处理初始化等。

当我在寻找如何解决这个问题时,找到了以下很好的例子 - 在 http://social.msdn.microsoft.com/forums/en-US/wcf/thread/447149d5-b44c-47cd-a690-20928244b52b/

[DataContract]
public class MyClassWithSpecialInitialization
{
    List<string> myList;
    string str1;
    [DataMember]
    public string Str1
    {
        get { return str1; }
        set
        {
            this.myList.Add(value);
            str1 = value;
        }
    }
    string str2;
    [DataMember]
    public string Str2
    {
        get { return str2; }
        set
        {
            this.myList.Add(value);
            str2 = value;
        }
    }
    public MyClassWithSpecialInitialization()
    {
        this.myList = new List<string>();
    }
    [OnDeserializing]
    public void OnDeserializing(StreamingContext context)
    {
        Console.WriteLine("Before deserializing the fields");
        this.myList = new List<string>();
    }
    [OnDeserialized]
    public void OnDeserialized(StreamingContext context)
    {
        Console.WriteLine("After deserializing the fields... myList should be populated with the values of str1 and str2");
    }
}

答案 2 :(得分:1)

如何生成客户端代码:VS添加服务参考,SVCUTIL?您使用的参数/设置是什么?您是否查看了客户端代码以查看实际创建的内容?

您的班级是否正常使用?我有一个问题,我创建了一个公开的数据协定类,但没有在服务方法中使用它,因此该类没有导出到客户端代码中。

答案 3 :(得分:0)

将类标记为数据协定时,不需要括号。你能提供你班级的代码样本吗?