Этот вопрос задавался много раз на 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>
Особенности задачи:
точки- ошибка в строке = 0, Позиция = 1 (что не имеет смысла)
- Нет элемента с именем, содержащим «.».
- Всех классов, которые делают его в файл надлежащим образом оформлены с
DataContract
- файл XML проверяется, чтобы действительно быть в UTF-8 кодировке (при считывании Notepad ++) и ни один из других версий (де) сериализации коды перечисленные в SO (которые неявно указывают кодировку UTF-8) помогли
- Я знаю, что файл уродливый (имена автогенерированных элементов вроде «d4p1: x002E» - Я единственный разработчик в этой компании, и, к сожалению, у меня нет времени хорошо украсить 100+ классов)
- Все работает отлично в течение 2,5 лет, проблемы начались сегодня.
Любой намек очень ценится, Daniel
UPDATE
Я добавил минимальное количество кода, воспроизводящий проблему here. application
пытается прочитать данный класс из xml-файла, классы, у которых есть проблемные dataContractNames, находятся в library\+support\+qprimitive
.
Вы не авторизованы. * Ошибка анализа XML в строке 2: xmlns: URI libTypes.salesApp не является абсолютным * после проверки вашего данного примера – lokusking
'_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
Еще лучше, можете ли вы поделиться [mcve], который сериализует типы, которые производят эти элементы ''? –
dbc