Для того, что вы точно ищете, это сработало для меня:
$path = Для того, что вы точно ищете, это сработало для меня:
[110]FILES['image']['name'];
$newName = "<Whatever name>".".".pathinfo($path, PATHINFO_EXTENSION);
После долгого изучения кода я, наконец, отказался от идеи использовать поведение XmlSerializer по умолчанию.
Все соответствующие классы теперь наследуют IXmlSerializer и реализуют Функции ReadXml () и WriteXml (). Я действительно надеялся пойти ленивым путем, но теперь, когда я поигрался с IXmlSerializer, я понял, что это совсем не сложно, а добавленная гибкость действительно хороша.
Возможно, вместо 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 ) )]
Невозможно воспроизвести; Я получаю (после исправления более непосредственных ошибок):
Username: Somebody
Characters: 1
Изменения:
WriteLine
вместо WriteFormat
(что препятствовало его компиляции) CreateAndSave
):
общедоступный пользователь () {Персонажи = новый список <Символ> (); }
общедоступный персонаж () {Навыки = новый список (); }
Раньше при сериализации списков я использовал аннотации [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] );
}
}
Надеюсь, что это поможет.
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;
Я бы попробовал использовать что-то вроде этого.
Это могло быть связано с десериализацией перечисления .... поскольку оно сериализовало его как строковое значение ... могли возникнуть проблемы с созданием правильного значения перечисления для символа. Не проверяли эту гипотезу ...