我有以下代码,取自https://learn.microsoft.com/En-Us/dotnet/standard/serialization/system-text-json/custom-contracts#example-serialize-private-fields.序列化Brains.Brain的字段可以正常工作,但是在序列化时,创建的实例具有(a,b,c,d)=(2,0,4,4),而实际上应该是(2,3,4,7).我试着找到更多关于如何使用JSON构造函数的信息,但没有找到太多.
如果它在Microsoft文档上(尽管我还没有找到它),或者其他有文档记录的地方,或者一些关于我应该如何使用它的示例代码,或者其他解决这个问题的东西,有人能告诉我吗?
using System.IO;
using System.Linq;
using System.Text.Json;
//
using System.Reflection;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace BinaryFiles
{
class Program
{
static void Main(string[] args)
{
Brains.Brain b = new(3);
Type btype = typeof(Brains).GetNestedTypes().Where(brain => (brain.GetInterface("IBrain") != null)).ToArray()[0];
Loader.Save("test", b, btype);
b.test();
IBrain newB = Loader.Load("test", btype);
newB.test();
}
}
internal interface IBrain
{
public void test();
}
class Brains {
[JsonIncludePrivateFields]
public class Brain : IBrain
{
private int a = 2;
private int b;
public int c = 4;
public int d;
/*
[JsonConstructor]
public Brain(int a, int b, int c, int d) =>
(this.a, this.b, this.c, this.d) = (a, b, c, d);
*/
public Brain(int B)
{
this.b = B;
this.d = B + 4;
}
public void test()
{
Console.WriteLine($"{a} {b} {c} {d}");
}
}
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public class JsonIncludePrivateFieldsAttribute : Attribute { }
internal static class Loader
{
static void AddPrivateFieldsModifier(JsonTypeInfo jsonTypeInfo)
{
if (jsonTypeInfo.Kind != JsonTypeInfoKind.Object)
return;
if (!jsonTypeInfo.Type.IsDefined(typeof(JsonIncludePrivateFieldsAttribute), inherit: false))
return;
foreach (FieldInfo field in jsonTypeInfo.Type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic))
{
JsonPropertyInfo jsonPropertyInfo = jsonTypeInfo.CreateJsonPropertyInfo(field.FieldType, field.Name);
jsonPropertyInfo.Get = field.GetValue;
jsonPropertyInfo.Set = field.SetValue;
jsonTypeInfo.Properties.Add(jsonPropertyInfo);
}
}
public static void Save(string fileName, IBrain brain, Type brainType)
{
var options = new JsonSerializerOptions
{
IncludeFields = true,
WriteIndented = true,
TypeInfoResolver = new DefaultJsonTypeInfoResolver
{
Modifiers = { AddPrivateFieldsModifier }
}
};
Console.WriteLine(JsonSerializer.Serialize(brain, brainType, options));
File.WriteAllText(fileName + ".json", JsonSerializer.Serialize(brain, options));
}
public static IBrain Load(string fileName, Type brainType)
{
var options = new JsonSerializerOptions
{
IncludeFields = true,
WriteIndented = true,
TypeInfoResolver = new DefaultJsonTypeInfoResolver
{
Modifiers = { AddPrivateFieldsModifier }
}
};
return (IBrain)JsonSerializer.Deserialize(File.ReadAllText(fileName + ".json"), brainType, options);
}
}
}```