簡體   English   中英

DataContractSerializer-名稱不能以“。”開頭 字符,十六進制值0x2E

[英]DataContractSerializer - Name cannot begin with the '.' character, hexadecimal value 0x2E

關於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. 沒有名稱包含“。”的元素。
  3. 使其成為文件的所有類均已使用DataContract進行了適當的裝飾
  4. 檢查XML文件是否確實采用UTF-8編碼(當由Notepad ++讀取時),SO上列出的(反)序列化代碼的其他版本(隱式指定UTF-8編碼)均無幫助
  5. 我知道文件很丑陋(自動生成的元素名稱,例如“ d4p1: x002E ”-我是該公司唯一的開發人員,不幸的是我沒有時間很好地裝飾100多個類)
  6. 在過去的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; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM