JSON.Net:所有的私人领域的系列化力,并在子类中的所有领域 [英] JSON.Net: Force serialization of all private fields and all fields in sub-classes
问题描述
我有几个不同类的类和我向这些类的信息给客户端,但我不希望他们都发出这样的一些是私人的,一些有 [的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屋!