我有一个共同的类(通常意味着它将其定义为自己的库,由客户端和服务使用)
[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");
}
这一切都有效,但我只能通过支持字段访问返回数据。我想实例化对象(或者我认为它可能是一个结构,因为它只有数据,而不是状态)
提前致谢。
答案 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.我想你知道继续,初始化和填写你方便的数据。