2016-09-14 3 views
0

Этот вопрос задавался много раз на SO, но ни одно решение не помогло мне.DataContractSerializer - Имя не может начинаться с символа '.' символ, шестнадцатеричное значение 0x2E

Мой файл данных сериализуется в XML-файл, используя dataContractSerializer. (Де) код сериализации следующее:

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. ошибка в строке = 0, Позиция = 1 (что не имеет смысла)
  2. Нет элемента с именем, содержащим «.».
  3. Всех классов, которые делают его в файл надлежащим образом оформлены с DataContract
  4. файл XML проверяется, чтобы действительно быть в UTF-8 кодировке (при считывании Notepad ++) и ни один из других версий (де) сериализации коды перечисленные в SO (которые неявно указывают кодировку UTF-8) помогли
  5. Я знаю, что файл уродливый (имена автогенерированных элементов вроде «d4p1: x002E» - Я единственный разработчик в этой компании, и, к сожалению, у меня нет времени хорошо украсить 100+ классов)
  6. Все работает отлично в течение 2,5 лет, проблемы начались сегодня.

Любой намек очень ценится, Daniel

UPDATE

Я добавил минимальное количество кода, воспроизводящий проблему here. application пытается прочитать данный класс из xml-файла, классы, у которых есть проблемные dataContractNames, находятся в library\+support\+qprimitive.

+0

Вы не авторизованы. * Ошибка анализа XML в строке 2: xmlns: URI libTypes.salesApp не является абсолютным * после проверки вашего данного примера – lokusking

+0

'_x002E_' как [' XmlConvert.EncodeLocalName() '] (https://msdn.microsoft.com/) en-us/library/system.xml.xmlconvert.encodelocalname (v = vs.110) .aspx) кодирует строку ''. "'. Таким образом, ваши элементы '' и '' имеют локальные имена, которые при декодировании отображаются на '..'. См. Https://dotnetfiddle.net/phUYO3.Можете ли вы поделиться типом, соответствующим 'DateOfValidity', чтобы мы могли увидеть, как был создан XML? Внедряет ли она 'IXmlSerializable' или' ISerializable'? – dbc

+0

Еще лучше, можете ли вы поделиться [mcve], который сериализует типы, которые производят эти элементы ''? – dbc

ответ

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; } 
} 
+0

Во-первых, спасибо большое. Проблема с наследованием - это моя ошибка во время создания образца проекта - был список ок. восемь интерфейсов, следующих за базовым классом, и во время удаления интерфейсов из объявления производного класса я также удалил базовый класс. Я обновил связанное решение. Во-вторых, однако, когда я запускаю как старое, так и это обновленное решение, я по-прежнему получаю исключение из «.». И я понимаю, почему вы этого не понимаете ... Я прекратил получать это исключение вчера ночью - без видимых причин. –

+0

@ DanielBencik - так ваш вопрос больше не воспроизводится? – dbc

+0

Кажется, так. Но, принимая во внимание, что, когда время ожидания жалуется, он жалуется на "." Я с удовольствием отвечу ваше сообщение в качестве ответа. –

Смежные вопросы