【问题标题】:Converting a Derived Class to Base Class for WCF Serialisation将派生类转换为基类以进行 WCF 序列化
【发布时间】:2011-11-15 20:45:24
【问题描述】:

我有两个课...

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

【问题讨论】:

  • 编辑请注意 - 如果您认为所提供的 sn-ps 错误,请使用更正的代码添加答案,而不是更正问题。

标签: wcf serialization base derived upcasting


【解决方案1】:

如果您的对象是 B 的实例,它们将始终被序列化为 B 的实例 - 这就是序列化的重点。如果你想忽略_c,试试这个:

[DataContract]
public class B : A
{
    private C _c;
}

如果类用DataContract 标记,则只有用DataMember 标记的属性/字段会被序列化 - 我不确定Serializable 如何与使用DataContract 的父级一起工作。

您还必须使用它来告诉服务和客户端B 可以使用:

public interface IClient
{
    [ServiceKnownType(typeof(B))]
    [OperationContract(IsOneWay = true)]
    void Somefunction(List<A> listofA);
}

如果您只想发送 A 实例,则必须创建 A 实例而不是 B 实例 - 在您的场景中,这实际上意味着转换。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 2013-11-17
  • 2011-05-07
  • 2022-10-14
  • 1970-01-01
相关资源
最近更新 更多