为什么[Serializable]会导致Newtonsoft.Json序列化程序包含支持字段?

问题描述 投票:0回答:1

如果我在类上有[Serializable]属性,那么它会导致生成的序列化Json字符串包含框架创建的后备成员。

例如,我在下面找到我的Id字段:

<Id>k__BackingField=20001  

我可以在SOF和其他地方找到很多资源来解决这个问题,但我找不到为什么Json序列化程序在看到[Serializable]属性时表现不同。

如果Jason序列化程序没有序列化成员并且只序列化属性,那么当使用[Serializable]属性修饰类时,为什么它的行为会有所不同呢?

请注意我没有找到解决此问题的方法,因为我已经发现了这个问题。我想知道为什么Newtonsoft.Jsonserialiser在这里表现不同。

json.net serializable
1个回答
0
投票

如果有人想在将来找到原因,下面将解释Json.Net如何序列化对象:

Breakdown of Type Serialization > Objects

默认情况下,类型的属性在选择退出模式下序列化。这意味着带有getter的所有公共字段和属性都会自动序列化为JSON,并且通过在其上放置JsonIgnoreAttribute来选择不应序列化的字段和属性。要序列化私有成员,可以将JsonPropertyAttribute放在私有字段和属性上。

类型也可以使用选择加入模式进行序列化。只有具有JsonPropertyAttribute或DataMemberAttribute的属性和字段才会被序列化。通过在类型上放置JsonObjectAttribute或DataContractAttribute来指定对象的选择加入模式。

最后,可以使用字段模式序列化类型。所有字段(包括公共字段和私有字段)都是序列化的,属性将被忽略。这可以通过在具有JsonObjectAttribute的类型上设置MemberSerialization.Fields或使用.NET SerializableAttribute并将DefaultContractResolver上的IgnoreSerializableAttribute设置为false来指定。

© www.soinside.com 2019 - 2024. All rights reserved.