将派生类转换为WCF序列化的基类

时间:2011-09-13 05:19:21

标签: wcf serialization base derived upcasting

我有两节课......

[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);

1 个答案:

答案 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个实例 - 在您的方案中,这实际上意味着转换。