2011-08-06 17 views
0

このクラスをシリアル化しようとすると、私はCommunicationExceptionを取得します。 これを行うには、特定のCollectionDataContractマークアップを使用する必要がありますか?DataContractSerializerを使用してDictionary <string、List <string>>をシリアル化する方法

[DataContract()] 
public class MyClass 
{ 
    [DataMember()] 
    public Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>(); 
} 

答えて

3

これは機能するはずです(下記の例を参照)。あなたが得る完全な例外は何ですか?

public class StackOverflow_6966835 
{ 
    [DataContract()] 
    public class MyClass 
    { 
     [DataMember()] 
     public Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>(); 
    } 
    [ServiceContract] 
    public interface ITest 
    { 
     [OperationContract] 
     MyClass GetMyClass(); 
    } 
    public class Service : ITest 
    { 
     public MyClass GetMyClass() 
     { 
      return new MyClass 
      { 
       dictionary = new Dictionary<string, List<string>> 
       { 
        { "one", "uno un eins".Split().ToList() }, 
        { "two", "dos deux zwei".Split().ToList() }, 
        { "three", "tres trois drei".Split().ToList() } 
       } 
      }; 
     } 
    } 
    public static void Test() 
    { 
     Console.WriteLine("Stand-alone serialization"); 
     MemoryStream ms = new MemoryStream(); 
     MyClass c = new Service().GetMyClass(); 
     DataContractSerializer dcs = new DataContractSerializer(typeof(MyClass)); 
     dcs.WriteObject(ms, c); 
     Console.WriteLine("Serialized: {0}", Encoding.UTF8.GetString(ms.ToArray())); 

     Console.WriteLine(); 
     Console.WriteLine("Now using in a service"); 

     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); 
     host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), ""); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     ChannelFactory<ITest> factory = new ChannelFactory<ITest>(new BasicHttpBinding(), new EndpointAddress(baseAddress)); 
     ITest proxy = factory.CreateChannel(); 

     Console.WriteLine(proxy.GetMyClass()); 

     ((IClientChannel)proxy).Close(); 
     factory.Close(); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
+0

エラーは、「パイプを読み取るときにエラーが発生しました:認識できない例外109(0x6d)」(英語に翻訳)のようなものです。ところで、私はNetNamedPipeBindingを使用しています。 – Peladao

+0

何らかの理由でサーバがチャネルを閉じた可能性があります。クライアントとサーバーの両方でトレースを有効にしてみてください。トレースにはその理由が含まれているはずです。 – carlosfigueira

+0

問題が見つかりました。あなたが言ったように、それはうまくいくはずで、実際には自分自身のコード例が間違っていたわけではありません。しかし、その例は明らかに単純化されており、問題は実際のコードにありました。 (私は誤って、[DataContract]またはKnownTypeとマークされていないワイヤで継承型を送信しようとしていました)。それがうまくいったはずの安心感ありがとう! – Peladao

関連する問題