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();
}
}
}