JSON serializer Generic extension

Работая над своим мелким проектом на Silverlight 4, пришла в голову мысль скрестить Extension Methods и Generics.
Получилось замечательно.

Ведь на самом деле, зачем писать метод расширения для конкретного объекта если можно это сделать для Generic классов. В этом случае мы получаем расширенные методы для всего множества имеющихся классов.

JsonExtension.cs

using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;

namespace JsonGenericExtExample
{
    public static class JsonExtension
    {
        /// <summary>
        /// Сериализовать объект в Json строку
        /// </summary>
        /// <param name="data">Объект</param>
        /// <returns>строка содержащая сериализованный обеъкт в формате Json</returns> 
        public static string GetJson(this T data) where T : class
        {
            string result;
            using (var stream = new MemoryStream())
            {
                var serializer = new DataContractJsonSerializer(typeof(T));
                serializer.WriteObject(stream, data);
                var reader = new StreamReader(stream);
                stream.Position = 0;
                result = reader.ReadToEnd();
            }
            return result;
        }

        /// <summary>
        /// Десериализация объекта из Json строки
        /// </summary>
        /// <typeparam name="T">Тип результирующего объекта</typeparam>
        /// <param name="data">Json строка</param>
        /// <returns>Десериализованный объект</returns>
        public static T Get<T>(this string data) where T : class
        {
            var deserializer = new DataContractJsonSerializer(typeof(T));

            using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(data)))
            {
                stream.Position = 0;
                return deserializer.ReadObject(stream) as T;
            }
        }
    }
}



Для использования достаточно вызвать созданный ранее метод.

// создаем тестовый экземпляр типом User
var CurrentUser = new User
                       {
                           FirstName = "Карим",
                           LastName = "Офигенов",
                           Age = 124
                       };
// вызываем extension метод у экземпляра для сериализации в JSON
string jsonString = CurrentUser.GetJson();

// Десериализуем 
User DeserializedUser = jsonString.Replace("Карим","Макар").Get<User>();

Использование этих методов очень простое, мало того они теперь будут у всех типов объектов в проекте.

Скриншот тестового приложения


Исходники проекта

Кросспост из блога

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.