Оптимизированный сериализатор / десериализатор JSON как метод расширения? - PullRequest
3 голосов
/ 23 января 2011

Я бы хотел как можно проще сериализовать любой объект в JSON, а затем просто преобразовать его обратно в объект type = safe.Может кто-нибудь сказать мне, что я делаю неправильно в методе расширения «FromJSONString»?

Редактировать

Для вашего удобства ниже представлен полный и функциональный метод расширения.Дайте мне знать, если увидите ошибки.

     public static string ToJSONString(this object obj)
    {
        using (var stream = new MemoryStream())
        {
            var ser = new DataContractJsonSerializer(obj.GetType());

            ser.WriteObject(stream, obj);

            return Encoding.UTF8.GetString(stream.ToArray());
        }
    }
    public static T FromJSONString<T>(this string obj)
    {  
        using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(obj)))
        {
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
            T ret = (T)ser.ReadObject(stream);
            return ret;
        }
    }

Ответы [ 2 ]

6 голосов
/ 23 января 2011

Вы должны предоставить строку JSON в MemoryStream для декодирования.В частности, вы должны изменить:

   MemoryStream stream1 = new MemoryStream(); 

, чтобы на самом деле получить байты строки:

   MemoryStream stream1 = new MemoryStream(Encoding.UTF8.GetBytes(obj))

При этом я бы также позаботился о том, чтобы правильно очистить память и уничтожить мои объекты... Кроме того, вместо использования StreamReader (который также должен быть удален), просто перекодируйте поток памяти в виде строки UTF-8.Ниже приведен код очистки.

   public static String ToJSONString(this Object obj)
   {
     using (var stream = new MemoryStream())
     {
       var ser = new DataContractJsonSerializer(obj.GetType());

       ser.WriteObject(stream, obj);

       return Encoding.UTF8.GetString(stream.ToArray());
     }
   }

   public static T FromJSONString<T>(this string obj)
   {
     using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(obj)))
     {
       DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
       T ret = (T)ser.ReadObject(stream);
       return ret;
     }
   }
2 голосов
/ 29 июня 2013

Это не работает должным образом в случае унаследованных объектов.

Десериализация возвращает только базовый объект, а не сериализованный объект. Изменение сериализации, как показано ниже, решит эту проблему.

public static String ToJSONString(this Object obj)
        {
            using (var stream = new MemoryStream())
            {
                var ser = new DataContractJsonSerializer(typeof(object));
                ser.WriteObject(stream, obj);
                return Encoding.UTF8.GetString(stream.ToArray());
            }
        }
...