DataContractSerializer -名称不能以'.'字符,十六进制值0x2E
本文关键字:十六进制 0x2E 字符 -名 DataContractSerializer 不能 | 更新日期: 2023-09-27 18:06:59
这个问题在SO上被问了很多次,但是没有一个解决方案对我有帮助。
使用dataContractSerializer将我的数据结构序列化为XML文件。(反)序列化代码如下:
public static void serialize<T>(T xObject, string xFilePath, string xIndent = "")
{
XmlWriterSettings xSettings = ( xIndent == "" ? new XmlWriterSettings {Indent = false } : new XmlWriterSettings { Indent = true, IndentChars = xIndent } );
using (XmlWriter xStream = XmlWriter.Create(xFilePath, xSettings))
new DataContractSerializer(typeof(T)).WriteObject(xStream, xObject);
}
public static T deserialize<T>(string xFilePath)
{
using (FileStream xStream = new FileStream(xFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
DataContractSerializer xSerializer = new DataContractSerializer(typeof(T));
return (T)xSerializer.ReadObject(xStream);
}
}
所写XML的一个片段是
<?xml version="1.0" encoding="utf-8"?>
<PxePriceListEod xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="libTypes.salesApp">
<DateOfValidity xmlns:d2p1="libTypes">
<d2p1:_x002E_>2016-09-09T00:00:00</d2p1:_x002E_>
</DateOfValidity>
<PriceRecords>
<AbstractPxePriceRecordEod i:type="PxePriceRecordEodBal">
<Product xmlns:d4p1="libTypes">
<d4p1:Ccy>
<d4p1:_x002E_>EUR</d4p1:_x002E_>
</d4p1:Ccy>
<d4p1:Commodity>
<d4p1:_x002E_>Electricity</d4p1:_x002E_>
</d4p1:Commodity>
<d4p1:Duration>
<d4p1:_x002E_>Month</d4p1:_x002E_>
</d4p1:Duration>
<d4p1:Exchange>
<d4p1:_x002E_>Pxe</d4p1:_x002E_>
</d4p1:Exchange>
<d4p1:Period>
<d4p1:_x002E_>9</d4p1:_x002E_>
</d4p1:Period>
<d4p1:Type>
<d4p1:_x002E_>Base</d4p1:_x002E_>
</d4p1:Type>
<d4p1:Year>
<d4p1:_x002E_>2016</d4p1:_x002E_>
</d4p1:Year>
</Product>
<IsDeduced xmlns:d4p1="libTypes">
<d4p1:_x002E_>false</d4p1:_x002E_>
</IsDeduced>
<IsInterpolated xmlns:d4p1="libTypes">
<d4p1:_x002E_>false</d4p1:_x002E_>
</IsInterpolated>
<IsSynthetic xmlns:d4p1="libTypes">
<d4p1:_x002E_>false</d4p1:_x002E_>
</IsSynthetic>
<Price xmlns:d4p1="libTypes">
<d4p1:_x002E_>30.45</d4p1:_x002E_>
</Price>
<DateOfValidity xmlns:d4p1="libTypes">
<d4p1:_x002E_>2016-09-09T00:00:00</d4p1:_x002E_>
</DateOfValidity>
</AbstractPxePriceRecordEod>
... more AbstractPxePriceRecordEod elements ...
</PriceRecords>
</PxePriceListEod>
问题特征:
- 错误指向Line=0, Position=1(这没有意义)
- 没有包含"的元素。"
- 所有进入文件的类都用
DataContract
适当地装饰 - XML文件被检查为真正的UTF-8编码(当被notepad++读取时),并且SO上列出的(反)序列化代码的其他版本(隐式指定UTF-8编码)都没有帮助 我知道这个文件很丑(自动生成的元素名称像"d4p1:x002E"-我是这家公司唯一的开发人员,不幸的是我没有时间很好地装饰100多个类)一切正常工作了2.5年,问题从今天开始。
任何提示都是非常感激的。丹尼尔
我在这里添加了少量重现问题的代码。application
尝试从xml文件中读取给定的类,有问题的dataContractNames的类位于library'+support'+qprimitive
。
_x002E_
是XmlConvert.EncodeLocalName()
对字符串"."
的编码方式。参见https://dotnetfiddle.net/phUYO3获得演示。所以你要么:
- 有一个以
"."
为名称的数据成员 - 已经实现了
IXmlSerializable
并且正在用这个名字写元素
话虽这么说,在其中一个数据成员上使用[DataMember(Name = ".")]
创建数据契约类型不会给我带来问题。也就是说,我可以成功地序列化和反序列化以下内容:
[DataContract(Namespace = "libTypes.salesApp")]
public class PxePriceListEod
{
[DataMember]
public DateOfValidity DateOfValidity { get; set; }
}
// DateOfValidity
[DataContract(Namespace = "libTypes")]
public class DateOfValidity
{
[DataMember(Name = ".")]
public DateTime DateTime { get; set; }
}