Облегченная строковая сериализация для .Net объектов - PullRequest
0 голосов
/ 29 июня 2011

Я прочитал несколько тем о сериализации, которые нашел здесь, но они не ответили на мой вопрос.

Мне нужна простая библиотека сериализации, которая отражала бы свойства, отмеченные определенным атрибутом, и сохраняла бы их значения в виде строки. Все свойства являются либо строковыми, либо непосредственно конвертируемыми в строку и из нее (встроенные типы значений, bool и т. Д.). Он также должен понимать простые контейнеры (например, общие списки) и сериализовать этот контент.

Элемент управления, который мне нужен над сериализацией, должен указывать, какие свойства должны быть сериализованы (только те, которые украшены атрибутом), и я также должен иметь возможность указать, что определенные свойства сериализуются как последние: во время сериализации они должны также десериализован как последние.

Формат не имеет значения, просто обычный param1=val1, param2=val2 подойдет, JSON также подойдет, как XML или даже экранированный или закодированный двоичный формат. Важно то, что все мои настройки могут храниться в одной строке, которую я могу легко сохранить и загрузить в свое приложение.

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 29 июня 2011

DataContractSerializer делает это - вы украшаете классы для сериализации с [DataContract], и только те члены, которые вы хотите сериализовать с [DataMember].Вы также можете контролировать порядок сериализации с помощью свойства Order атрибута DataMember.

DataContractSerializer (DCS) всегда сериализует объекты как XML , но используемый им XML можетбудь то «нормальный» XML с тегами или более компактный двоичный формат, в зависимости от XmlWriter, который вы передаете ему во время сериализации (и XmlReader во время десериализации).Еще одна опция, которая дает вам больший контроль над созданным XML (но он не такой производительный), это класс XmlSerializer, который имеет свои собственные атрибуты для управления сериализацией.

Код нижепоказан пример сериализуемого типа DCS и его сериализации:

    [DataContract]
    public class Person
    {
        [DataMember(Order = 1)]
        public string Name;
        [DataMember(Order = 2)]
        public int Age;
        [DataMember(Order = 3)]
        public Address Address;
    }
    [DataContract]
    public class Address
    {
        [DataMember(Order = 1)]
        public string Street;
        [DataMember(Order = 2)]
        public string City;
        [DataMember(Order = 3)]
        public string State;
    }
    public static void Test()
    {
        MemoryStream ms = new MemoryStream();
        XmlWriterSettings ws = new XmlWriterSettings
        {
            Indent = true,
            IndentChars = "  ",
            Encoding = Encoding.UTF8,
        };
        XmlWriter w = XmlWriter.Create(ms, ws);
        DataContractSerializer dcs = new DataContractSerializer(typeof(Person));
        Person person = new Person
        {
            Name = "John",
            Age = 22,
            Address = new Address
            {
                Street = "1 Main St.",
                City = "Springfield",
                State = "ZZ",
            }
        };
        dcs.WriteObject(w, person);
        w.Flush();
        Console.WriteLine("Serialized:");
        Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
        ms.Position = 0;
        XmlReader r = XmlReader.Create(ms);
        Person deserialized = (Person)dcs.ReadObject(r);
        Console.WriteLine(deserialized);
    }
2 голосов
/ 29 июня 2011

Если JSON подойдет, взгляните на JSON.Net: http://json.codeplex.com/

1 голос
/ 29 июня 2011

Вы также можете проверить сериализатор YAX: http://www.codeproject.com/KB/XML/yaxlib.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...