XmlSerializer не десериализует XmlAttributes с префиксом пространства имен. Ошибка?C#

Место общения программистов C#
Ответить
Anonymous
 XmlSerializer не десериализует XmlAttributes с префиксом пространства имен. Ошибка?

Сообщение Anonymous »

Я пытаюсь десериализовать данный фрагмент XML, который выглядит следующим образом: Мои классы (VS 2022 Professional, целевая платформа .NET 8.0):

Код: Выделить всё

public static class Namespaces
{
public const string tst = "myGivenNamespace";
}

[XmlRoot("myRootElement", Namespace = Namespaces.tst)]
public class MyRootElement
{
[XmlArray("myList"), XmlArrayItem(typeof(MyListItem), Namespace = Namespaces.tst)]
public List? MyList { get; set; }
}

[XmlRoot("myListItem", Namespace = Namespaces.tst)]
public class MyListItem
{
[XmlElement("myElementName", Namespace = Namespaces.tst)]
public MyElementName? ElementName { get; set; }
}

[XmlRoot("myElementName", Namespace = Namespaces.tst)]
public class MyElementName
{
[XmlAttribute("value", Namespace = Namespaces.tst)]
public string? Value { get; set; }
}
Мой код для сериализации и десериализации:

Код: Выделить всё

var namespaces = new XmlSerializerNamespaces();
namespaces.Add("tst", "myGivenNamespace");
var serializer = new XmlSerializer(typeof(MyRootElement));

var root1 = new MyRootElement();
root1.MyList = new List();
root1.MyList.Add(new MyListItem { ElementName = new MyElementName { Value = "element1" } });
root1.MyList.Add(new MyListItem { ElementName = new MyElementName { Value = "element2" } });

// serialization
using (var fstream = new FileStream(@"c:\temp\serializertestOut.xml", FileMode.Create))
{
serializer.Serialize(fstream, root1, namespaces);
}

// deserialization
MyRootElement? root2 = null;
using (var fstream = new FileStream(@"c:\temp\serializertestIn.xml", FileMode.Open))
{
root2 = (MyRootElement?)serializer.Deserialize(fstream);
}

MyRootElement? root3 = null;
using (var fstream = new FileStream(@"c:\temp\serializertestOut.xml", FileMode.Open))
{
root3 = (MyRootElement?)serializer.Deserialize(fstream);
}
Когда я запускаю этот код, происходит следующее:
  • root1 сериализуется в это:
Обратите внимание на отсутствие префикса "tst:" в "значении" атрибута XmlAttribute.
  • root2 создается как MyRootElement-Instance с пустым списком MyListElements.
  • root3 создается правильно, как и ожидалось, поскольку он получает ранее созданный XML из сериализатора в качестве входных данных.
Итак, что-то не так с моим кодом? Или есть ошибка в XmlSerializer, и если да, то есть ли способ ее обойти?

Подробнее здесь: https://stackoverflow.com/questions/798 ... prefix-bug
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»