現在、プロジェクトで Json.Net シリアライザーを利用しようとしています。
私が最近直面した問題の 1 つは、デシリアライズされたオブジェクトがプライベート リスト アイテムをすべて複製することです。次のように再現できます。
- タイプ
private
のフィールドを持つクラスを作成します。ここで、ジェネリック パラメーターは他のクラスですList<>
List<>
- フィールド
public
を取得/設定するプロパティを追加private
- そのクラスのインスタンスを作成し、プロパティを使用して内部リストに 1 項目を追加します。
- プライベート クラス データを表示するように設定された新しい DefaultContractResolver でシリアル化します。
- 逆シリアル化
問題を再現するコード:
public class ClassParam
{
public int? ParamOne
{
get;
set;
}
}
public class ClassWithParams
{
private List<ClassParam> _privateFieid = new List<ClassParam>();
public List<ClassParam> PropertWithBackingField
{
get { return _privateFieid; }
set { _privateFieid = value; }
}
public void AddElementToPrivateField(ClassParam classParam)
{
_privateFieid.Add(classParam);
}
}
[Test]
public void Test()
{
var instance = new ClassWithParams();
var param1 = new ClassParam { ParamOne = 1 };
instance.PropertWithBackingField.Add(param1);
var contractResolver = new DefaultContractResolver();
contractResolver.DefaultMembersSearchFlags |= BindingFlags.NonPublic;
string serializedInstance = JsonConvert.SerializeObject(instance,
Formatting.Indented,
new JsonSerializerSettings()
{
ContractResolver = contractResolver
});
var deserializeInstance = JsonConvert.DeserializeObject(serializedInstance, typeof(ClassWithParams),
new JsonSerializerSettings()
{
ContractResolver = contractResolver
});
}
公共財産を削除すると、PropertWithBackingField
すべてClassWithParams
問題ありません。ContractResolver のカスタム セットアップを使用しない場合も、問題はなくなりました。しかし、クラスのプライベート データのすべてがパブリック プロパティを介して公開されていない場合は、すぐにシリアル化する必要があります。
コードの何が問題になっていますか? Json.Net を使用して微妙な点はありますか、それともバグですか?