栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么在尝试通过序列化为JSON打印对象时缺少某些成员?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么在尝试通过序列化为JSON打印对象时缺少某些成员?

默认情况下,Json.NET将仅序列化 公共 属性和字段。您的字段

A
b
私有的
。要使非公共(私有或内部)成员被Json.NET序列化,您可以:

  1. 公开它们:
        public int A;    public int b;

但是,从风格上讲,如果要使其公开,最好将它们转换为属性:

        public class Test    {        public int A { get; private set; }        public int b { get; private set; }        public Test(int a, int b)        { this.A = a; this.b = b;        }    };

对于Json.NET,只有获取器需要公开才能序列化它们。

  1. 然后用标记
    [JsonProperty]
        [JsonProperty]    int A;    [JsonProperty]    int b;

这也适用于非公共财产。

  1. 用标记您的对象,
    [DataContract]
    并用标记您的字段
    [DataMember]
        [DataContract]    public class Test    {        [DataMember]        int A;        [DataMember]        int b;        public Test(int _a, int _b)        { A = _a; b = _b;        }    };

请注意,数据合同序列化是可选的,因此您需要使用标记 每个
要序列化的成员

[DataMember]
。有点麻烦,但如果您不希望c#模型依赖于Json.NET,则很有用。

这也适用于非公共财产。

  1. 用以下标记您的对象
    [JsonObject(MemberSerialization = MemberSerialization.Fields)]
        [JsonObject(MemberSerialization = MemberSerialization.Fields)]    public class Test    {        // Remainder as before...    };

由于在解释文件的

MemberSerialization
MemberSerialization.Fields
可确保

所有公共和私有字段都已序列化。可以使用JsonIgnoreAttribute或NonSerializedAttribute排除成员。也可以通过使用SerializableAttribute标记该类并将DefaultContractResolver上的IgnoreSerializableAttribute设置为false来设置此成员序列化模式。

当然,这只会导致非公共 字段 被序列化,而不是非公共属性,但是如果您的目的是出于调试目的而 打印任意变量 ,则可能需要这样做。

  1. 使用可序列化所有公共和非公共字段的自定义合同解析器。

将属性和公共或私有字段进行序列化。

另一个方法是
使用JSON.NET继承的私有字段

DeclaredFieldContractResolver
从_C#序列
化开始,通过自动假定所有对象都标记为,仅序列化公共字段或私有字段
MemberSerialization.Fields`。您可以这样使用它:

    var settings = new JsonSerializerSettings{    ContractResolver = DeclaredFieldContractResolver.Instance};var json = JsonConvert.SerializeObject(t1, Formatting.Indented, settings);
  1. 创建一个序列化必要字段和属性的自定义
    JsonConverter
    。由于字段是私有的,因此需要为嵌套类型:
    public class Test

    {
    public class TestJsonConverter : JsonConverter
    {
    public override bool CanConvert(Type objectType)
    {
    return typeof(Test).IsAssignableFrom(objectType);
    }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)    {        var test = (Test)value;        writer.WriteStartObject();        writer.WritePropertyName(nameof(Test.A));        serializer.Serialize(writer, test.A);        writer.WritePropertyName(nameof(Test.b));        serializer.Serialize(writer, test.b);        writer.WriteEndObject();    }    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)    {        throw new NotImplementedException();    }}// Remainder as before

    }

并像这样使用它:

    var json = JsonConvert.SerializeObject(t1, Formatting.Indented, new Test.TestJsonConverter());

在这种情况下,由于类型是嵌套的,因此您的模型仍将依赖于Json.NET,这使选项#2成为更好的选择。

如果仅出于调试目的转储对象,则#5可能是最佳选择。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/616678.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号