4

我有两节课...

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

1 回答 1

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

于 2011-09-13T07:13:28.183 回答