2

WCF操作を介して一般的なリストを渡すときに問題が発生しています。この場合、int の List があります。例 4 については、こちらの MSDNで説明されています。MSDN サンプルでは、​​次のように説明されていることに注意してください。

// これは、一般的な List が既知の型に追加された int[] と同等であるため、正常にシリアライズおよびデシリアライズされます。

上記は、DataContract です。

    [DataContract]
    [KnownType(typeof(int[]))]
    [KnownType(typeof(object[]))]
    public class AccountData
    {
        [DataMember]
        public object accNumber1;

        [DataMember]
        public object accNumber2;

        [DataMember]
        public object accNumber3;

        [DataMember]
        public object accNumber4;


    }

クライアント側では、次のように操作を呼び出しています。

DataTransfer.Service.AccountData data = new DataTransfer.Service.AccountData()
{
  accNumber1 = 100,
  accNumber2 = new int[100],
  accNumber3 = new List<int>(),
  accNumber4 = new ArrayList()
};
cService.AddAccounts(data);

また、生成された AccountData obj (WCF プロキシ) の装飾は次のとおりです。

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="AccountData", Namespace="http://schemas.datacontract.org/2004/07/DataTransfer.Service")]
[System.SerializableAttribute()]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(DataTransfer.Client.CustomerServiceReference.PurchaseOrder))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(DataTransfer.Client.CustomerServiceReference.Customer))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(int[]))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(object[]))]

例外は次のとおりです。

パラメータ http://tempuri.org/:myEntityをシリアライズしようとしてエラーが発生しました。InnerException メッセージは、データ コントラクト名 'ArrayOfint: http://schemas.microsoft.com/2003/10/Serialization/Arrays ' を持つ 'Type Generic List' でした。静的に知られていないタイプを既知のタイプのリストに追加します

4

1 に答える 1

1

次のように型を宣言すると、シリアル化は正常に機能します。

[DataContract]   
public class AccountData
{
    [DataMember]
    public object accNumber1 {get; set;}

    [DataMember]
    public int[] accNumber2 { get; set; }

    [DataMember]
    public List<int> accNumber3 { get; set; }

    [DataMember]
    public ArrayList accNumber4 {get; set;}

}

(パブリック フィールドの代わりにプロパティを使用することをお勧めします。)

フィールドをオブジェクト型にする必要がありますか? 上記のクラスの制限が強すぎる場合は、より柔軟にする方法がありますが、意図したほど柔軟ではない可能性があります。

KnownTypeまた、属性は個々のプロパティではなく、クラス全体に適用されることに注意してください。

于 2010-05-28T12:00:12.917 に答える