XmlSerializer. Десериализуйте (), не десериализовывает Список <T> правильно

Для того, что вы точно ищете, это сработало для меня:

$path = 

Для того, что вы точно ищете, это сработало для меня:

[110]FILES['image']['name']; $newName = "<Whatever name>".".".pathinfo($path, PATHINFO_EXTENSION);
5
задан John Saunders 26 July 2009 в 00:24
поделиться

6 ответов

После долгого изучения кода я, наконец, отказался от идеи использовать поведение XmlSerializer по умолчанию.

Все соответствующие классы теперь наследуют IXmlSerializer и реализуют Функции ReadXml () и WriteXml (). Я действительно надеялся пойти ленивым путем, но теперь, когда я поигрался с IXmlSerializer, я понял, что это совсем не сложно, а добавленная гибкость действительно хороша.

1
ответ дан 14 December 2019 в 01:16
поделиться

Возможно, вместо StreamReader создайте XmlReader. Кроме того, в качестве шага по устранению неполадок вы можете попробовать свой существующий код с явными типами (как показано ниже) вместо объявлений «var».

public static User Restore()
{
  if (!File.Exists("data.xml"))
    throw new FileNotFoundException("data.xml");

  XmlReader xr = XmlReader.Create("data.xml");
  XmlSerializer serializer = new XmlSerializer(typeof(User));
  var user = (User)serializer.Deserialize(xr);
  xr.Close();
  return user;
}

EDIT: Также попробуйте аннотацию XmlInclude для своего класса User.

[XmlInclude( typeof( Character ) )]
1
ответ дан 14 December 2019 в 01:16
поделиться

Невозможно воспроизвести; Я получаю (после исправления более непосредственных ошибок):

Username: Somebody
Characters: 1

Изменения:

  • WriteLine вместо WriteFormat (что препятствовало его компиляции)
  • инициализировать списки в конструкторах по умолчанию (которые препятствовал работе CreateAndSave ):
    • общедоступный пользователь () {Персонажи = новый список <Символ> (); }
    • общедоступный персонаж () {Навыки = новый список (); }
5
ответ дан 14 December 2019 в 01:16
поделиться

Раньше при сериализации списков я использовал аннотации [XmlArray] и [XmlArrayItem]. Затем вы поместите аннотацию [XmlIgnore] в свойство Characters. В вашем случае это будет выглядеть примерно так:

[XmlArray("Characters")]
[XmlArrayItem("Character", Type=typeof(Character))]
public Character[] _ Characters
{
    get
    {
        //Make an array of Characters to return 
        return Characters.ToArray();
    }

    set
    {
        Characters.Clear();
        for( int i = 0; i < value.Length; i++ )
            Characters.Add( value[i] );
    }
}

Надеюсь, что это поможет.

2
ответ дан 14 December 2019 в 01:16
поделиться
Stream stream = File.Open(filename + ".xml", FileMode.Open);
User user = null;
using (XmlReader reader = XmlReader.Create(stream))
{
    user = IntermediateSerializer.Deserialize<User>(reader, null);
}
stream.Close();

return user;

Я бы попробовал использовать что-то вроде этого.

0
ответ дан 14 December 2019 в 01:16
поделиться

Это могло быть связано с десериализацией перечисления .... поскольку оно сериализовало его как строковое значение ... могли возникнуть проблемы с созданием правильного значения перечисления для символа. Не проверяли эту гипотезу ...

-2
ответ дан 14 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: