2011-11-15 2 views
0

を使用してXSDファイルからクラスを生成しながら、私は図書館で[DataMembar]を定義している問題svcutil.exe

svcutil.exeツールを使用してSharing DataContracts between WCF Servicesに取り組んでいます。データ契約を共有するために、私は DataContract.dllDataContract.xsdに変換しています。

コマンドの.xsdを生成した後

svcutil /dconly <my DataContractDLL path> 

で、私はコマンドに

svcutil /dconly /language:CS DataContract.xsd /out:ClientDataContracts.cs 

を使用してDataContract.xsdからクラスファイルを生成していますすべてのものは、罰金行って、上記の手順で働いていました。直面

問題:

次のように私は私のDataContract.dllライブラリのエンティティの一つにDictionary *タイプを追加した(つまり私はDictionaryタイプのTimeLogsDataMemberを追加しました。)

public partial class RecordDto 
{ 
    /// <summary> 
    /// Gets or sets the Comment. 
    /// </summary> 
    /// <value>Insurance Company.</value> 
    [WcfSerialization::DataMember(Name = "InsuranceCompany", IsRequired = false, Order = 25)] 
    public InsuranceCompanyDto InsuranceCompany { get; set; } 

    [WcfSerialization::DataMember(Name = "TimeLogs", IsRequired = false, Order = 26)] 
    public Dictionary<String, DateTime> TimeLogs 
    { 
     get; 
     set; 
    } 
} 

を追加した後Dictionaryタイプ.xsd.csに変換中にエラーが発生し始めました。

enter image description here

Dictionaryタイプの後にエラーが表示されるのはなぜですか?

どうすれば解決できますか?

答えて

2

たIDictionaryが直列ではないインタフェースには、この

[XmlRoot("dictionary")] 
public class SerializableDictionary<TKey, TValue> 
    : Dictionary<TKey, TValue>, IXmlSerializable 
{ 
    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); 
     XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); 

     bool wasEmpty = reader.IsEmptyElement; 
     reader.Read(); 

     if (wasEmpty) 
      return; 

     while (reader.NodeType != System.Xml.XmlNodeType.EndElement) 
     { 
      reader.ReadStartElement("item"); 
      reader.ReadStartElement("key"); 
      TKey key = (TKey)keySerializer.Deserialize(reader); 
      reader.ReadEndElement(); 

      reader.ReadStartElement("value"); 
      TValue value = (TValue)valueSerializer.Deserialize(reader); 
      reader.ReadEndElement(); 

      this.Add(key, value); 
      reader.ReadEndElement(); 
      reader.MoveToContent(); 
     } 
     reader.ReadEndElement(); 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); 
     XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); 

     foreach (TKey key in this.Keys) 
     { 
      writer.WriteStartElement("item"); 
      writer.WriteStartElement("key"); 

      keySerializer.Serialize(writer, key); 
      writer.WriteEndElement(); 

      writer.WriteStartElement("value"); 
      TValue value = this[key]; 
      valueSerializer.Serialize(writer, value); 
      writer.WriteEndElement(); 

      writer.WriteEndElement(); 
     } 
    } 
} 

のように、独自の辞書を実装する必要があり、この情報がお役に立てば幸いです。

+0

詳細をお知らせください。または任意の参照リンク –

+0

もちろん、あなたはここでより多くのhttp://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspxを読むことができます何らかの理由でインターフェイスIDictionaryとクラスディクショナリはシリアル化できませんxmlで辞書をシリアライズしたい場合は、シリアル化可能なDictionaryの独自の実装を作成する必要があります。プロパティDictionary TimeLogsはパブリックになりますSerializableDictionary TimeLogs – Ginka