次の ServiceContract および DataContract クラスがあります。
[ServiceContract]
public interface IWcfService
{
[OperationContract]
Response GetData();
}
[DataContract]
public class Response
{
[DataMember]
public Dictionary<string, object> Data { get; set; }
}
Response.Data ディクショナリの値が int、string、double、またはその他の単純なプリミティブ型の場合、WCF はオブジェクトを正常にシリアル化できます。しかし、Response.Data ディクショナリの値が List< string> 型の場合、データを受信して逆シリアル化しようとすると、クライアントは次の例外をスローしました。
Message=The formatter threw an exception while trying to deserialize the message:
There was an error while trying to deserialize parameter http://tempuri.org/:GetDataResult.
The InnerException message was 'Error in line 1 position 990.
Element 'http://schemas.microsoft.com/2003/10/Serialization/Arrays:Value' contains data from a type
that maps to the name 'http://schemas.microsoft.com/2003/10/Serialization/Arrays:ArrayOfstring'.
The deserializer has no knowledge of any type that maps to this name.
Consider using a DataContractResolver or add the type corresponding to 'ArrayOfstring'
to the list of known types - for example, by using the KnownTypeAttribute attribute or
by adding it to the list of known types passed to DataContractSerializer.'.
また、次のように、KnownType 属性を ServiceContract および DataContract に追加しようとしました。
[ServiceContract]
[ServiceKnownType(typeof(List<string>))]
[ServiceKnownType(typeof(Dictionary<string, string>))]
[ServiceKnownType(typeof(Dictionary<string, List<string>>))]
public interface IWcfService
{
[OperationContract]
[ServiceKnownType(typeof(List<string>))]
[ServiceKnownType(typeof(Dictionary<string, string>))]
[ServiceKnownType(typeof(Dictionary<string, List<string>>))]
Response GetData();
}
[DataContract]
[ServiceKnownType(typeof(List<string>))]
[ServiceKnownType(typeof(Dictionary<string, string>))]
[ServiceKnownType(typeof(Dictionary<string, List<string>>))]
[KnownType(typeof(List<string>))]
[KnownType(typeof(Dictionary<string, string>))]
[KnownType(typeof(Dictionary<string, List<string>>))]
public class Response
{
[DataMember]
public Dictionary<string, object> Data { get; set; }
}
しかし、これはどれも役に立ちませんでした。誰でもこれについて何か考えがありますか?
更新しました
データは次のようになります。
Data = new new DIctionary<string, object>
{
{"_id", 12344},
{"names", new List<string>{ "John", "Peter", "Jack"}},
{"time", DateTime.Now}
}
Dictionary< string, object> を使用した理由: サーバーは、int、List、DataTime などの「動的」データの辞書をクライアントに送信する必要があります。Dictionary を使用してこの問題を解決するのに役立ちますが、元の型情報も失われます。たとえば、クライアントは List を必要とし、コレクションを表示するために何らかのデータ バインディングを行うため、この場合 List.ToString() は役に立ちません。