Сообщений: 17
Тем: 5
Зарегистрирован: Aug 2016
Репутация:
0
Код: [SRC="csharp"] public class Test
{
[XmlAttribute]
public int Id;
public List<Test> Tests = new List<Test>();
}[/SRC]
Код: [SRC="csharp"] using (var reader = XmlReader.Create("Test.xml"))
{
var serializer = new XmlSerializer(typeof(List<Test>));
try
{
var list = (List<Test>)serializer.Deserialize(reader);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
reader.Close();
}[/SRC]
Объяснить, почему, я не могу, из класса юзать Tests List<Test>();?
Откуда я сериализовал не хочу юзать, как мне быть?
Сообщений: 832
Тем: 125
Зарегистрирован: Jan 2009
Репутация:
404
А не лучше ли для Списков использовать бинарную сериализацию?
Код: using System;
using System.IO;
using System.Runtime.Serialization;
using static Utils.Logger;
namespace Utils
{
public sealed class Serialize<T> : IDisposable
{
#region private
#region vars
IFormatter formatter;
#endregion
#region methods
public bool save(T serObject, string serpath)
{
try
{
using (FileStream s = File.Create(serpath))
{
formatter.Serialize(s, serObject);
}
//infoDebugS("Сериализируемый объект успешно сохранен.");
return true;
}
catch(Exception e)
{
error("Ошибка при попытке сохранения объекта.", e);
return false;
}
}
public T restore(string serpath)
{
T newObject;
try
{
using (FileStream s = File.OpenRead(serpath))
{
newObject = (T)formatter.Deserialize(s);
}
//infoDebugS("Деcериализируемый объект успешно восстановлен.");
return newObject;
}
catch(Exception e)
{
error("Ошибка при попытке востановления объекта.", e);
return default(T);
}
}
public void Dispose()
{
formatter = null;
}
#endregion
#endregion
#region public
#region methods
public Serialize(IFormatter formatter)
{
this.formatter = formatter;
}
#endregion
#region get/set
#endregion
#endregion
}
}
А тут инициализация
Код: Serialize<OrderedDictionary<string, Account>> sr = new Serialize<OrderedDictionary<string, Account>>(new BinaryFormatter());
потому что с бинарной у меня все работает отлично но вот xml сериализирует только поля тобишь только значение вот этой штуки сохранится...
Код: public string AccountName
{
get
{
return accountName;
}
set
{
accountName = value;
}
}
а это пропадет в небытие
Код: string somethink = "Hello dude";
Сообщений: 17
Тем: 5
Зарегистрирован: Aug 2016
Репутация:
0
krisadr, хм, спасибо попробую
Сообщений: 2,303
Тем: 24
Зарегистрирован: Sep 2010
Репутация:
5,617
Enfern Написал:Код: [SRC="csharp"] public class Test
{
[XmlAttribute]
public int Id;
public List<Test> Tests = new List<Test>();
}
using (var reader = XmlReader.Create("Test.xml"))
{
var serializer = new XmlSerializer(typeof(List<Test>));
try
{
var list = (List<Test>)serializer.Deserialize(reader);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
reader.Close();
}[/SRC]
Объяснить, почему, я не могу, из класса юзать Tests List<Test>();?
Откуда я сериализовал не хочу юзать, как мне быть?
Потому что ересь какую-то написали.
Код: [SRC="csharp"]
public class Test
{
[XmlAttribute]
public int Id;
[XmlArray(ElementName = "Tests")]
[XmlArrayItem(ElementName = "Test")]
public List<Test> Tests { get; set; }
}
.........................
using (var reader = XmlReader.Create("Test.xml"))
{
var serializer = new XmlSerializer(typeof(Test));
try
{
var testObject = (Test)serializer.Deserialize(reader);
var list = testObject.Tests;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
[/SRC]
Сообщений: 17
Тем: 5
Зарегистрирован: Aug 2016
Репутация:
0
ANZO, Не подскажешь, как теперь записать обратно все это в хмл?
А то снова перемудрил блин
Код: public class TestSerializer
{
public static void Load()
{
using (var reader = XmlReader.Create("data\\New_Test.xml"))
{
var serializer = new XmlSerializer(typeof(Test), new XmlRootAttribute("TestData"));
try
{
var testObject = (Test)serializer.Deserialize(reader);
var list = testObject.Tests;
foreach (var Test in testObject.Tests)
{
Console.WriteLine("Test Id: {0}", Test.Id);
}
Console.WriteLine("Tests Count: {0}", list.Count);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}
Код: TestSerializer.Load();
var Test = new Test();
Console.WriteLine("Tests Count: {0}", Test.Tests.Count);
все равно ругается, в чем проблема у меня?
Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.
Сообщений: 555
Тем: 2
Зарегистрирован: Feb 2011
Репутация:
1,507
Код: static void Main(string[] args)
{
var entry = new Test()
{
Id = 123,
Tests = new List<Test>()
{
new Test()
{
Id = 124,
},
new Test()
{
Id = 125,
}
}
};
var filename = "test.xml";
var xmls = new XmlSerializer(typeof(Test));
using(var file = File.Create(filename))
{
xmls.Serialize(file, entry);
}
using(var reader = new StreamReader(filename))
{
var result = xmls.Deserialize(reader) as Test;
Console.WriteLine($"deserialized id: {result.Id} list:");
foreach(var test in result.Tests)
{
Console.WriteLine($"---------------: {test.Id}");
}
}
Console.WriteLine("done");
Console.ReadLine();
}
Код: public class Test
{
[XmlAttribute]
public int Id;
[XmlArray]
public List<Test> Tests;
}
Аннотации не обязательны, они лишь влияют на структуру хранения данных в файле. поэксперементируй с ними и без
Сообщений: 6,450
Тем: 262
Зарегистрирован: Nov 2007
Репутация:
44,165
Enfern, XmlSerializer.Serialize
Enfern;416957 Написал:TestSerializer.Load();
var Test = new Test();
Что это и для чего? У вас объект testObject в методе Load, его верните.
Сообщений: 17
Тем: 5
Зарегистрирован: Aug 2016
Репутация:
0
PROGRAMMATOR,
Хотелось, сделать так, загрузил, в класс занеслась информация.
Потом вызвать класса, считать данные что в нем хранится.
а получается так, что я могу только в TestSerializer получить информацию.
а без него уже, ничего хорошего.
Код: public class TestSerializer
{
public static Test testObject;
public static Test Load()
{
using (var reader = XmlReader.Create("data\\New_Test.xml"))
{
var serializer = new XmlSerializer(typeof(Test), new XmlRootAttribute("TestData"));
try
{
testObject = (Test)serializer.Deserialize(reader);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
return testObject;
}
}
|