JSON.Net:所有的私人领域的系列化力,并在子类中的所有领域 [英] JSON.Net: Force serialization of all private fields and all fields in sub-classes

查看:133
本文介绍了JSON.Net:所有的私人领域的系列化力,并在子类中的所有领域的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个不同类的类和我向这些类的信息给客户端,但我不希望他们都发出这样的一些是私人的,一些有 [的JSONObject( MemberSerialization.OptIn)] 标志等。

不过,现在我想要做的所有这些对象的备份,当我需要关闭服务器,并每隔12小时(我不希望使用数据库),所以我想这样做(如果可能)是强制JSON.Net序列化对象和属于该对象的所有对象转换。

例如:

 类Foo
{
 公众诠释数目;
 私人字符串名称;
 私人PrivateObject PO =新PrivateObject(); 公共字符串的toJSON()
 {/ *我的序列化公共领域,我的财产和对象PrivateObject * /}}

我想这code(即使它是过时的),但它不序列与我的目标对象:

  Newtonsoft.Json.JsonSerializerSettings JSS =新Newtonsoft.Json.JsonSerializerSettings();        Newtonsoft.Json.Serialization.DefaultContractResolver DCR =新Newtonsoft.Json.Serialization.DefaultContractResolver();
        dcr.DefaultMembersSearchFlags | = System.Reflection.BindingFlags.NonPublic;
        jss.ContractResolver = DCR;        返回Newtonsoft.Json.JsonConvert.SerializeObject(这一点,JSS);


解决方案

这应该工作:

  VAR seetings =新JsonSerializerSettings(){ContractResolver =新MyContractResolver()};
VAR JSON = JsonConvert.SerializeObject(OBJ,设置);


 公共类MyContractResolver:Newtonsoft.Json.Serialization.DefaultContractResolver
{
    保护覆盖的IList< JsonProperty> CreateProperties(类型类型,MemberSerialization memberSerialization)
    {
        VAR道具= type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic可| BindingFlags.Instance)
                        。选择(p值=> base.CreateProperty(对,memberSerialization))
                    .Union(type.GetFields(BindingFlags.Public | BindingFlags.NonPublic可| BindingFlags.Instance)
                               。选择(F => base.CreateProperty(F,memberSerialization)))
                    .ToList();
        props.ForEach(P => {p.Writable = TRUE; p.Readable = TRUE;});
        返回道具;
    }
}

I have a class with several different classes and I send the information in these classes out to clients but I don't want to send them all out so some are private, some have the [JsonObject(MemberSerialization.OptIn)] flag etc.

However, now I want to do a backup of all these objects when I need to shutdown the server and every 12 hours (I don't want to use a database) so what I want to do (if possible) is to force the JSON.Net Serializer to convert the object and all the object belonging to that object.

For example:

class Foo
{
 public int Number;
 private string name;
 private PrivateObject po = new PrivateObject();

 public string ToJSON()
 { /* Serialize my public field, my property and the object PrivateObject */ }

}

I tried this code (even though it's obsolete) but it doesn't Serialize the objects related to my object:

 Newtonsoft.Json.JsonSerializerSettings jss = new Newtonsoft.Json.JsonSerializerSettings();

        Newtonsoft.Json.Serialization.DefaultContractResolver dcr = new Newtonsoft.Json.Serialization.DefaultContractResolver();
        dcr.DefaultMembersSearchFlags |= System.Reflection.BindingFlags.NonPublic;
        jss.ContractResolver = dcr;



        return Newtonsoft.Json.JsonConvert.SerializeObject(this, jss);

解决方案

This should work:

var seetings = new JsonSerializerSettings() { ContractResolver = new MyContractResolver() };
var json = JsonConvert.SerializeObject(obj, settings);


public class MyContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        var props = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                        .Select(p => base.CreateProperty(p, memberSerialization))
                    .Union(type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                               .Select(f => base.CreateProperty(f, memberSerialization)))
                    .ToList();
        props.ForEach(p => { p.Writable = true; p.Readable = true; });
        return props;
    }
}

这篇关于JSON.Net:所有的私人领域的系列化力,并在子类中的所有领域的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆