我正在使用Newtonsoft从文件中反序列化数据。当我从两组不同的数据中反序列化两个不同的实例时,两个实例的属性最终都具有相同的值。我创建了一个小项目来解决该问题。这是我的2个JSON文件
File1.json:
{
"Name": "File1",
"SomeProperty":
{
"Value": 1
}
}
File2.json:
{
"Name": "File2",
"SomeProperty":
{
"Value": 2
}
}
SomeProperty.cs
namespace Json
{
public class SomePropertyDto
{
public static SomePropertyDto Default = new SomePropertyDto
{
Value = 0
};
public int Value { get; set; }
}
}
FileDataDto.cs
namespace Json
{
public class FileDataDto
{
public string Name { get; set; }
public SomePropertyDto SomeProperty
{
get => someProperty;
set => someProperty = value;
}
private SomePropertyDto someProperty = SomePropertyDto.Default;
}
}
Program.cs
using System.IO;
using Newtonsoft.Json;
namespace Json
{
class Program
{
static void Main(string[] args)
{
string json1 = File.ReadAllText("File1.json");
string json2 = File.ReadAllText("File2.json");
FileDataDto fileData1 = JsonConvert.DeserializeObject<FileDataDto>(json1);
FileDataDto fileData2 = JsonConvert.DeserializeObject<FileDataDto>(json2);
}
}
}
反序列化FileDataDto的两个实例后,它们的SomeProperty值都相同。但是,如果我不将FileDataDtotosomeProperty字段初始化为SomePropertyDto.Default,则
private SomePropertyDto someProperty;// = SomePropertyDto.Default;
它正常工作。如果我将初始化包含到默认值
private SomePropertyDto someProperty = SomePropertyDto.Default;
反序列化fileData1之后,SomeProperty值等于预期的1。但是,在反序列化fileData2之后,fileData1和FileData2实例的SomeProperty值都等于2,这不是预期的值。
答案 0 :(得分:0)
根据https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/JsonSerializerSettings.cs#L46,默认的对象创建设置为“自动”,即https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/ObjectCreationHandling.cs#L34
重复使用现有对象,并在需要时创建新对象。
因此,当您的Default对象在那里时,someProperty会保留所有FileDataDto实例的相同共享对象。
如果需要该默认值,请提供自定义的JsonSerializerSettings(将ObjectCreationHandling设置为Replace)。