DataContractSerializer - 名称不能以'开头。'。字符,十六进制值0x2E

时间:2016-09-14 06:51:37

标签: c# xml datacontractserializer

这个问题在SO上已被问过很多次,但这两个解决方案都没有帮助我。

我的datastruct使用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>

问题的特点:

  1. 错误指向Line = 0,Position = 1(没有意义)
  2. 没有名称包含&#34;。&#34;
  3. 的元素
  4. 所有进入文件的类都使用DataContract
  5. 进行了适当的修饰
  6. 检查XML文件是否真的采用UTF-8编码(当用Notepad ++读取时)并且没有其他版本的(反)序列化SO上列出的代码(隐式指定UTF-8编码)帮助
  7. 我知道文件很难看(自动生成的元素名称如&#34; d4p1: x002E &#34; - 我是这家公司唯一的开发人员,不幸的是我没有时间精心装饰100 +班级)
  8. 一切都运转良好2。5年,问题从今天开始。
  9. 非常感谢任何提示, 丹尼尔

    更新

    我添加了少量代码来重现问题hereapplication尝试从xml文件中读取给定的类,具有有问题的dataContractNames的类位于library\+support\+qprimitive中。

1 个答案:

答案 0 :(得分:1)

_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; }
}