WCF简单序列化

时间:2013-06-09 15:13:49

标签: c# wcf serialization

我有一个共同的类(通常意味着它将其定义为自己的库,由客户端和服务使用)

    [Serializable]
    Class C1
    {
        string s1;
        string s2;
    }

在我的WCF服务中,我创建一个实例,填充并返回它: 这是界面:

    [ServiceContract]
    public interface myInterface
    {
        [OperationContract]
        c1 GetClass(string number);
    }

这是我的服务类:

    public class ColorTracker : myInterface
    {

        public c1 GetObj(string value)
        {
            c1 theColor = new c1();
            c1.s1= "value1";
            c1.s2= "value2";
            return  c1;
        }
    }

客户端:

    using (ServieClient bmClient = new ServiceClient())
    {
        c1 theColor;

        theColor =  (c1) bmClient.GetObj("test");

    }

这一切都有效,但我只能通过支持字段访问返回数据。我想实例化对象(或者我认为它可能是一个结构,因为它只有数据,而不是状态)

提前致谢。

2 个答案:

答案 0 :(得分:0)

WCF不关心[Serializable]属性。如果您希望将类作为数据协定,则应使用[DataContract]属性标记它。

另外,将字段转换为属性,并使用[DataMember]属性标记它们。

[DataContract]
Class C1
{
    [DataMember]
    public string s1 {get;set;}

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

答案 1 :(得分:0)

当您的属性为[Serializable]时,在客户端,您可以使用私有字段!但是,由于你的属性是自动生成的fiels {get; set;},在客户端你可以看到自动生成的 prop__BackingFields ;

你可以像这样重构你的属性:

[Serializable ]
public class MyData
{
    private string _prop1;

    public  string Prop1
    {
        get { return _prop1; }
        set { _prop1 = value; }
    }

但我认为编码问题的最佳方法是:

1.定义两个数据合同:

[DataContract  ]
public class ServerSideFilledData
{...}and
[DataContract  ]
public class ClientSideFilledData
{...}

2.使用两个MessageBody属性定义消息合同:

[MessageContract]
public class MixedServerandClientSideData
{
    private ClientSideFilledData clientSideFilledData;
    [MessageBodyMember]
    public ClientSideFilledData ClientSideFilledData
    {
        get { return clientSideFilledData; }
        set { clientSideFilledData = value; }
    }

    private ClientSideFilledData serverSideFilledData;
    [MessageBodyMember]
    public ClientSideFilledData ServerSideFilledData
    {
        get { return serverSideFilledData; }
        set { serverSideFilledData = value; }
    }
}

3.而不是Serializable或DataContract,使用您的消息在客户端和服务器之间交换数据

[ServiceContract]
public interface IService1
{
    [OperationContract]
    MixedServerandClientSideData DoWork();
}

4.我想你知道继续,初始化和填写你方便的数据。