我有两节课......
[Serializable]
[DataContract]
public class A
{
[DataMember]
public string _a { get; set; }
[DataMember]
public bool _b { get; set; }
}
[Serializable]
public class B : A
{
[NonSerialized]
[XmlIgnore]
private C _c;
}
...我有一个WCF服务:
public interface IClient
{
[ServiceKnownType(typeof(A))]
[OperationContract(IsOneWay = true)]
void Somefunction(List<A> listofA);
}
我需要向客户端发送一个A列表,但我只有一个B列表。我不关心“_c”字段。我会认为这很简单:
List<A> listofA = new List<A>();
foreach (B instanceofb in somestore.Values)
{
listofA.Add((A)instanceofb);
}
Client.Somefunction(listofA);
但是对象的派生类型存储在列表中的基本类型实例中。 WCF似乎试图反序列化并失败,因为C不可序列化(即使我将其标记为忽略)。我在客户端没有得到任何响应,服务器端方法也没有响应。
但是我可以创建并发送(并在客户端上接收)类型A:
List<A> listofA = new List<A>() { new A() };
Client.Somefunction(listofA);
是否有任何方法可以避免畏缩(有效):
public A Convert(B _instanceofb)
{
A _instanceofA = new A();
A._a = _instanceofb._a;
A._b = _instanceofb._b;
return A;
}
和..
List<A> listofA = new List<A>();
foreach (B instanceofb in somestore.Values)
{
listofA.Add(Convert(instanceofb));
}
Client.Somefunction(listofA);
答案 0 :(得分:1)
如果您的对象是B的实例,它们将始终被序列化为B的实例 - 这是序列化的要点。如果您想忽略_c
,请尝试以下操作:
[DataContract]
public class B : A
{
private C _c;
}
如果使用DataContract
标记了类,则只会标记标有DataMember
的属性/字段 - 我不确定Serializable
如何与使用DataContract
的父项一起使用。< / p>
您还必须使用此功能告诉服务和客户可以使用B
:
public interface IClient
{
[ServiceKnownType(typeof(B))]
[OperationContract(IsOneWay = true)]
void Somefunction(List<A> listofA);
}
如果您只想发送A
个实例,则必须创建A
实例而不是B
个实例 - 在您的方案中,这实际上意味着转换。