C# 使用svcuti.exe从xsd文件生成类时出现问题

C# 使用svcuti.exe从xsd文件生成类时出现问题,c#,wcf,datacontract,svcutil.exe,C#,Wcf,Datacontract,Svcutil.exe,我正在使用svcuti.exe工具 我已经在库中定义了[DataMembar]。我正在转换共享数据合同 DataContract.dll到DataContract.xsd文件 命令是 svcutil /dconly <my DataContractDLL path> 一切顺利,按照上述步骤进行 面临的问题: 我在我的DataContract.dll库的一个实体中添加了Dictionary*类型,如下所示(即我添加了Dictionary类型的TimeLogs数据成员) 公共部分类记录

我正在使用
svcuti.exe
工具

我已经在库中定义了
[DataMembar]
。我正在转换共享数据合同
DataContract.dll
DataContract.xsd
文件

命令是

svcutil /dconly <my DataContractDLL path>
一切顺利,按照上述步骤进行

面临的问题:

我在我的
DataContract.dll
库的一个实体中添加了
Dictionary
*类型,如下所示(即我添加了
Dictionary
类型的
TimeLogs
数据成员)

公共部分类记录到
{
/// 
///获取或设置注释。
/// 
///保险公司。
[WcfSerialization::DataMember(Name=“InsuranceCompany”,IsRequired=false,Order=25)]
公共保险公司To InsuranceCompany{get;set;}
[WcfSerialization::DataMember(Name=“TimeLogs”,IsRequired=false,Order=26)]
公共词典时间日志
{
得到;
设置
}
}
在添加
字典
类型后,我在将
.xsd
转换为
.cs
时开始出错:

添加
字典后
键入我为什么会出错


如何解决它?

接口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();
        }
    }
}
[XmlRoot(“字典”)]
公共类序列化字典
:字典,IXmlSerializable
{
public System.Xml.Schema.XmlSchema GetSchema()
{
返回null;
}
public void ReadXml(System.Xml.XmlReader)
{
XmlSerializer keySerializer=新的XmlSerializer(typeof(TKey));
XmlSerializer valueSerializer=新的XmlSerializer(typeof(TValue));
bool waspempy=reader.isemptyelment;
reader.Read();
如果(为空)
返回;
while(reader.NodeType!=System.Xml.XmlNodeType.EndElement)
{
reader.ReadStartElement(“项目”);
reader.ReadStartElement(“密钥”);
TKey=(TKey)键序列化器。反序列化(读取器);
reader.ReadEndElement();
reader.ReadStartElement(“价值”);
TValue value=(TValue)valueSerializer.反序列化(读取器);
reader.ReadEndElement();
添加(键、值);
reader.ReadEndElement();
reader.MoveToContent();
}
reader.ReadEndElement();
}
public void WriteXml(System.Xml.XmlWriter)
{
XmlSerializer keySerializer=新的XmlSerializer(typeof(TKey));
XmlSerializer valueSerializer=新的XmlSerializer(typeof(TValue));
foreach(此.Keys中的TKey键)
{
编写人。书面启动项(“项目”);
writer.writeStart元素(“键”);
序列化(编写器,键);
writer.writeedelement();
writer.writeStarteElement(“值”);
t值=此[键];
序列化(写入程序,值);
writer.writeedelement();
writer.writeedelement();
}
}
}

希望这有帮助。

您能提供更多详细信息吗??或者任何参考链接当然,出于某种原因,您可以在此处阅读更多信息接口IDictionary,因此类字典不能在xml中序列化,因此如果您想序列化字典,您应该编写自己的可序列化字典实现,在您的情况下,属性public Dictionary TimeLogs将成为public SerializableDictionary TimeLogs
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;
    }
}
[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();
        }
    }
}