Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
C# сериализация/десериализация
#1
Код:
[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>();?
Откуда я сериализовал не хочу юзать, как мне быть?
Ответ
#2
А не лучше ли для Списков использовать бинарную сериализацию?
Код:
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";
Ответ
#3
krisadr, хм, спасибо попробуюSmile
Ответ
#4
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]
Ответ
#5
ANZO, Не подскажешь, как теперь записать обратно все это в хмл?
А то снова перемудрил блин Smile

Код:
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);

все равно ругается, в чем проблема у меня?
Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.
Ответ
#6
Код:
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;
    }

Аннотации не обязательны, они лишь влияют на структуру хранения данных в файле. поэксперементируй с ними и без
Ответ
#7
Enfern, XmlSerializer.Serialize

Enfern;416957 Написал:TestSerializer.Load();
var Test = new Test();

Что это и для чего? У вас объект testObject в методе Load, его верните.
Ответ
#8
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;
        }
    }
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)