Проблема при создании класса из файла xsd с помощью svcutil.exe - PullRequest
0 голосов
/ 15 ноября 2011

Я работаю над Совместное использование DataContracts между службами WCF с использованием инструмента svcutil.exe

Я определил [DataMembar] в библиотеке. Для обмена данными контракта я конвертирую DataContract.dll до DataContract.xsd файлов.

Команда is

svcutil /dconly <my DataContractDLL path>

После генерации .xsd я создаю файл класса из DataContract.xsd с помощью команды

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

Все прошло хорошо и работало в описанных выше шагах.

Обнаружена проблема:

Я добавил Dictionary* type в одну из сущностей моей DataContract.dll библиотеки следующим образом (т.е. я добавил TimeLogs DataMember типа Dictionary.)

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 введите почему я получаю ошибку?

Как мне это решить?

1 Ответ

2 голосов
/ 15 ноября 2011

интерфейс 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();
        }
    }
}

Надеюсь, это поможет.

...