4

私には2つのクラスがあります...

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

ただし、オブジェクトの派生型は、リストの基本型インスタンス内に格納されます。Cはシリアル化できないため、WCFは逆シリアル化を試みて失敗するようです(無視済みとしてマークした場合でも)。クライアント側で応答がなく、サーバー側のメソッドが失敗します。

ただし、タイプ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かわかりません。SerializableDataContract

Bまた、これを使用して、使用できるサービスとクライアントを伝える必要があります。

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

インスタンスのみを送信する場合は、インスタンスではなくインスタンスAを作成する必要があります。シナリオでは、実際には変換を意味します。AB

于 2011-09-13T07:13:28.183 に答える