1

例: My Service コントラクト

[ServiceContract]
public interface IProvider
{
    [OperationContract]
    DataSet CreateDataSetFromSQL(string command, params object[] par);
}

パラメータの1つがArray/List/ArrayListになるまで、すべてが正常に機能します。シリアライゼーション例外が発生します:

data contract name 'ArrayOfanyType:http://schemas.microsoft.com/2003/10/Serialization/Arrays' is not expected. Add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.'.  Please see InnerException for more details.

前述したように、パラメーターの 1 つである場合、文字列配列に対して同じエラーが発生します。

クライアント

    private static ChannelFactory<IProvider> _channel;
    private static IProvider _proxy;
    private static DataTransferClient _client;

    public DataSet CreateDataSetFromSQL(string commandCode, params object[] par)
    { 
       return _proxy.CreateDataSetFromSQL(commandCode, par);
    }

それを回避する方法はありますか?

4

1 に答える 1

2

エラーメッセージを実際に読んでいない場合に備えて:

たとえば、KnownTypeAttribute属性を使用するか、DataContractSerializer に渡される既知の型のリストにそれらを追加することにより、静的に認識されていない型を既知の型のリストに追加します。

タイプは「オブジェクト」であるため、「単なるオブジェクト」ではないものは静的に認識されず、KnownType-Attribute を介して追加する必要があります。を渡したい場合は、タイプが の属性をサービスの上List<Whatever>に置く必要があります。KnownTypeList<Whatever>

サービスを投稿せず、インターフェイスのみを投稿したため、代わりにインターフェイスでServiceKnownType属性を使用することもできます。

[ServiceContract]
[ServiceKnownType(typeof(List<string>))] // <== this will enable the serializer to send and receive List<string> objects
public interface IProvider
{
    [OperationContract]
    DataSet CreateDataSetFromSQL(string command, params object[] par);
}
于 2013-09-23T09:28:37.607 に答える