如何在C#UWP中实现理想的json序列化/反序列化?

麦考伊四世

注意:该问题仅限于C#UWP

梦想:

public static class Serializer {
    // return json string
    public string Serialize(object obj) { ??? }
    // return T from json string
    public T Deserialize<T>(string jsonString) { ??? }
}

我最近来过的:

public static class Serializer
{
    public static string Serialize(object obj, DataContractJsonSerializerSettings settings=null)
    {
        if (obj == null) {
            throw new NullReferenceException();
        }

        settings = settings ?? new DataContractJsonSerializerSettings();
        DataContractJsonSerializer jsonizer = new DataContractJsonSerializer(obj.GetType(), settings);
        string jsonString = null;
        using ( MemoryStream stream = new MemoryStream() )
        {
            jsonizer.WriteObject(stream, obj);
            stream.Position = 0;
            StreamReader sr = new StreamReader(stream);
            jsonString = sr.ReadToEnd();
        }
        return jsonString;
    }

    public static T Deserialize<T>(string jsonString)
    {
        DataContractJsonSerializer jsonizer = new DataContractJsonSerializer(typeof(T));
        T obj;
        using (Stream stream = GenerateStreamFromString(jsonString))
        {
            obj = (T)jsonizer.ReadObject(stream);
        }
        return obj;
    }

    private static Stream GenerateStreamFromString(string s)
    {
        MemoryStream stream = new MemoryStream();
        StreamWriter writer = new StreamWriter(stream);
        writer.Write(s);
        writer.Flush();
        stream.Position = 0;
        return stream;
    }
}

问题

我发布的部分解决方案适用于简单情况。但是,当要反序列化的对象的子类型难以(或不可能)从json字符串确定时,它会失败。例如,

IList<Animal> animals = new List<Animal>();
animals.add(new Dog("Woofy"));
animals.add(new Cat("Fluffy"));

string json = Serializer.Serialize(animals);
IList<Animal> result = Serializer.Deserialize<List<Animal>>(json);
// ^ fails because subtype information was lost during serialization

bool succeeded = result.get(0).Name.Equals("Woofy") && result.get(1).Name.Equals("Fluffy");

我在寻找什么:

“梦想”中指定的框架的实现,该框架传递了“问题”中指定的驱动程序。欢迎发表评论。

麦考伊四世

我得出的答案是:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace SerializationDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Dog dog = new Dog()
            {
                Name = "Woofy",
                HadWalkToday = true
            };
            Cat cat = new Cat()
            {
                Name = "Fluffy",
                ColorOfWhiskers = "Brown"
            };
            IList<Animal> animals = new List<Animal>()
            {
                dog,
                cat
            };

            string json = Serializer.Serialize(animals);
            IList<Animal> result = Serializer.Deserialize<List<Animal>>(json);

            bool serializerSuccessful = dog.Equals(result[0]) && cat.Equals(result[1]);
        }
    }

    public class Animal
    {
        public string Name { get; set; }

        public override bool Equals(object obj)
        {
            var animal = obj as Animal;
            return this.Name == animal.Name;
        }
    }

    public class Dog : Animal
    {
        public bool HadWalkToday { get; set; }

        public override bool Equals(object obj)
        {
            var dog = obj as Dog;
            return this.HadWalkToday == dog.HadWalkToday && base.Equals(obj);
        }
    }

    public class Cat : Animal
    {
        public string ColorOfWhiskers { get; set; }

        public override bool Equals(object obj)
        {
            var cat = obj as Cat;
            return this.ColorOfWhiskers == cat.ColorOfWhiskers && base.Equals(obj);
        }
    }

    public static class Serializer
    {
        private static readonly JsonSerializerSettings settings = new JsonSerializerSettings()
        {
            TypeNameHandling = TypeNameHandling.All,
            Formatting = Formatting.Indented
        };

        public static string Serialize(object obj)
        {
            if (obj == null)
            {
                throw new NullReferenceException();
            }

            string jsonString = JsonConvert.SerializeObject(obj, settings);
            return jsonString;
        }

        public static T Deserialize<T>(string jsonString)
        {
            T obj = JsonConvert.DeserializeObject<T>(jsonString, settings);
            return obj;
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C#UWP中从RIOT Api反序列化Json的问题

来自分类Dev

如何在C#中反序列化JSON

来自分类Dev

如何在C ++中对称地实现序列化和反序列化模板函数

来自分类Dev

Play框架:如何在JSON中对枚举进行序列化/反序列化

来自分类Dev

如何在C#中序列化/反序列化不可变列表类型

来自分类Dev

如何在Rails中反序列化json

来自分类Dev

如何在MVC中反序列化JSON数据

来自分类Dev

如何在Rails中反序列化json

来自分类Dev

如何在MVC中反序列化JSON数据

来自分类Dev

无法在UWP应用中反序列化JSON

来自分类Dev

如何在 Typescript 中序列化/反序列化复杂对象,例如反序列化对象与序列化对象的类型相同

来自分类Dev

如何在UPW C#中从Web API反序列化JSON数组?

来自分类Dev

如何在C#中反序列化JSON数组

来自分类Dev

我如何反序列化和序列化牛顿json中的复杂json数据?

来自分类Dev

如何反序列化oData JSON?

来自分类Dev

如何反序列化JSON

来自分类Dev

如何快速反序列化JSON

来自分类Dev

如何反序列化多维JSON

来自分类Dev

如何反序列化json?

来自分类Dev

如何反序列化Json对象?

来自分类Dev

如何反序列化 JSON 对象?

来自分类Dev

如何在Rest api的HTTP方法请求和响应中应用Json序列化或反序列化

来自分类Dev

如何在Rest api的HTTP方法请求和响应中应用Json序列化或反序列化

来自分类Dev

如何在C#中使用json.net忽略序列化的属性,但保留反序列化

来自分类Dev

反序列化JSON C#

来自分类Dev

C#:反序列化JSON

来自分类Dev

反序列化JSON C#

来自分类Dev

C#:反序列化JSON

来自分类Dev

反序列化 json C#