Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Программирование / Programming (https://forum.zone-game.info/forumdisplay.php?f=98)
-   -   C# сериализация/десериализация (https://forum.zone-game.info/showthread.php?t=41240)

Enfern 14.08.2016 02:49

C# сериализация/десериализация
 
Код:

   public class Test
    {
        [XmlAttribute]
        public int Id;
 
        public List<Test> Tests = new List<Test>();
    }
Code: C#

Код:

   
       
   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();
            }
Code: C#

Объяснить, почему, я не могу, из класса юзать Tests List<Test>();?
Откуда я сериализовал не хочу юзать, как мне быть?

krisadr 14.08.2016 02:53

Re: обьяснити
 
А не лучше ли для Списков использовать бинарную сериализацию?
Код:

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";

Enfern 14.08.2016 03:00

Re: обьяснити
 
krisadr, хм, спасибо попробую:)

ANZO 14.08.2016 03:52

Re: обьяснити
 
Цитата:

Сообщение от Enfern (Сообщение 416938)
Код:

   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();
            }
Code: C#

Объяснить, почему, я не могу, из класса юзать Tests List<Test>();?
Откуда я сериализовал не хочу юзать, как мне быть?

Потому что ересь какую-то написали.
Код:

 
    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());
                }
            }
 
Code: C#


Enfern 14.08.2016 12:24

Re: обьяснити
 
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);

все равно ругается, в чем проблема у меня?
Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.

KID 14.08.2016 16:03

Re: C# сериализация/десериализация
 
Код:

        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;
    }

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

PROGRAMMATOR 14.08.2016 16:06

Re: обьяснити
 
Enfern, XmlSerializer.Serialize

Цитата:

Сообщение от Enfern (Сообщение 416957)
TestSerializer.Load();
var Test = new Test();

Что это и для чего? У вас объект testObject в методе Load, его верните.

Enfern 14.08.2016 16:18

Re: обьяснити
 
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;
        }
    }



Текущее время: 02:33. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot