第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

JSON.Net:強(qiáng)制序列化所有私有字段和子類中的所有字段

JSON.Net:強(qiáng)制序列化所有私有字段和子類中的所有字段

C#
慕標(biāo)琳琳 2019-09-02 17:10:46
我有一個(gè)有幾個(gè)不同類的類,我將這些類中的信息發(fā)送給客戶,但我不想將它們?nèi)堪l(fā)送出去,所以有些是私有的,有些是[JsonObject(MemberSerialization.OptIn)]旗幟等。但是,現(xiàn)在我想在需要關(guān)閉服務(wù)器時(shí)每隔12個(gè)小時(shí)(我不想使用數(shù)據(jù)庫(kù))對(duì)所有這些對(duì)象進(jìn)行備份,所以我想做的(如果可能的話)是強(qiáng)制JSON .Net Serializer轉(zhuǎn)換對(duì)象和屬于該對(duì)象的所有對(duì)象。例如: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 */ }}我嘗試了這段代碼(即使它已經(jīng)過(guò)時(shí)了)但它沒(méi)有序列化與我的對(duì)象相關(guān)的對(duì)象: 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);
查看完整描述

3 回答

?
12345678_0001

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊

這應(yīng)該工作:


var settings = 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;

    }

}


查看完整回答
反對(duì) 回復(fù) 2019-09-02
?
小怪獸愛(ài)吃肉

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊

它需要.NET 3.5或更高版本。


對(duì)于我們這些堅(jiān)持2.0的人......


public class ForceJSONSerializePrivatesResolver : Newtonsoft.Json.Serialization.DefaultContractResolver

{

    protected override IList<Newtonsoft.Json.Serialization.JsonProperty> CreateProperties(System.Type type, MemberSerialization memberSerialization)

    {

        var props = type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);


        List<Newtonsoft.Json.Serialization.JsonProperty> jsonProps = new List<Newtonsoft.Json.Serialization.JsonProperty>();


        foreach( var prop in props )

        {

        jsonProps.Add( base.CreateProperty(prop, memberSerialization));

        }


        foreach( var field in type.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) )

        {

        jsonProps.Add ( base.CreateProperty( field, memberSerialization ) );

        }


        jsonProps.ForEach(p => { p.Writable = true; p.Readable = true; });

        return jsonProps;

    }

}

......似乎有效。


查看完整回答
反對(duì) 回復(fù) 2019-09-02
?
楊魅力

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊

這是一個(gè).linq腳本的完整實(shí)現(xiàn),以防任何人想要使用私有子類進(jìn)行測(cè)試 - 例如,見(jiàn)A有私有子類B.


void Main()

{

    var a = A.Test();

    SerialiseAllFields.Dump(a);

}


class A

{

    private int PrivField1;

    private int PrivProp1 { get; set; }

    private B PrivSubClassField1;


    public static A Test()

    {

        return new A { PrivField1 = 1, PrivProp1 = 2, PrivSubClassField1 = B.Test() };

    }

}


class B

{

    private int PrivField1;

    private int PrivProp1 { get; set; }


    public static B Test()

    {

        return new B { PrivField1 = 3, PrivProp1 = 4 };

    }

}


// Define other methods and classes here

public static class SerialiseAllFields

{

    public static void Dump(object o, bool indented = true)

    {

        var settings = new Newtonsoft.Json.JsonSerializerSettings() { ContractResolver = new AllFieldsContractResolver() };

        if (indented)

        {

            settings.Formatting = Newtonsoft.Json.Formatting.Indented;

        }

        Newtonsoft.Json.JsonConvert.SerializeObject(o, settings).Dump();

    }

}


public class AllFieldsContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver

{

    protected override IList<Newtonsoft.Json.Serialization.JsonProperty> CreateProperties(Type type, Newtonsoft.Json.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;

    }

}

有趣的是,屬性的支持字段也是序列化的,即輸出為:


{

  "PrivProp1": 2,

  "PrivField1": 1,

  "<PrivProp1>k__BackingField": 2,

  "PrivSubClassField1": {

    "PrivProp1": 4,

    "PrivField1": 3,

    "<PrivProp1>k__BackingField": 4

  }

}


查看完整回答
反對(duì) 回復(fù) 2019-09-02
  • 3 回答
  • 0 關(guān)注
  • 1448 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)