我有一个“设置”类,其中包含一个带有“InputBindings”类值的字典。使用 JSON.NET,它可以正确地将设置数据写入/序列化到 .json 文件中,但在读取/反序列化文件时,它不会正确创建对象。
我尝试使用“TypeNameHandling”和“Custom JsonConverter T”,但我不确定我是否正确使用它们,并且它没有像尝试一样解决我的问题。我一直在查看文档,但我不确定此时该尝试什么。我不确定为什么它正确序列化所有内容但没有正确反序列化它。
这是相关的类,去掉了一些不必要的东西,比如枚举、日志记录和我为字典分配的默认值。
public static class PlayerInput
{
public static Settings InputSettings { get; private set; } = new Settings();
public static void Initialize()
{
SetSettingsToDefaults();
FileOps.WriteSettingsToFile();
FileOps.ReadSettingsFromFile();
}
}
public class Settings
{
public PlayerInput.MovementStyleEnum MovementStyle { get; set; } = PlayerInput.MovementStyleEnum.ScreenSpace;
public PlayerInput.InputModeEnum InputMode { get; set; } = PlayerInput.InputModeEnum.KeyboardAndMouse;
public Dictionary<InputBinding.GameInputsEnum, InputBinding> InputBindingsKBM { get; set; } = new Dictionary<InputBinding.GameInputsEnum, InputBinding>();
public Dictionary<InputBinding.GameInputsEnum, InputBinding> InputBindingsController { get; set; } = new Dictionary<InputBinding.GameInputsEnum, InputBinding>();
}
public class InputBinding
{
public GameInputsEnum InputName { get; private set; }
public InputTypeEnum InputType { get; private set; }
public string InputButton { get; private set; }
public KeyCode InputKey { get; private set; }
public int InputMouseButton { get; private set; }
public InputBinding(GameInputsEnum _inputName, InputTypeEnum _inputType, string _inputButton, KeyCode _inputKey, int _mouseButton)
{
this.InputName = _inputName;
this.InputType = _inputType;
this.InputButton = _inputButton;
this.InputKey = _inputKey;
this.InputMouseButton = _mouseButton;
}
}
public static class FileOps
{
private const string SettingsFilePath = "Settings.json";
public static bool ReadSettingsFromFile()
{
if(File.Exists(SettingsFilePath) == false)
{
return false;
}
else
{
Settings settings = JsonConvert.DeserializeObject<Settings>(File.ReadAllText(SettingsFilePath));
// Looping through the dictionaries in settings here is where the objects don't seem to properly reflect what is written in the .json file
return true;
}
}
public static void WriteSettingsToFile()
{
File.WriteAllText(SettingsFilePath, JsonConvert.SerializeObject(PlayerInput.InputSettings, Formatting.Indented));
}
}
FileOps.WriteSettingsToFile() 正确创建了一个看起来应该有的 .json 文件。见https://pastebin.com/DZ5paXgY
当我使用一些 foreach 循环遍历 FileOps.ReadSettingsFromFile() 读取的设置时,它表明它没有正确地在字典中创建 InputBinding 对象。见https://pastebin.com/FP2DaAaE
字典的键被正确填充,但值是为每个键重复的相同默认值。
例如:
“暂停:提交,,无,0”
从输出的第 6 行开始应该看起来像
"Pause : Pause, , , 27, 0" 反映了您从 .json 文件的第 19 行开始看到的内容。
首先,不要在参数名称中使用下划线。下划线前缀应该只用于字段而不是参数。其次,由于下划线,JSON.NET 无法将 JSON 属性映射到构造函数参数。
删除下划线,JSON.NET 将能够将 JSON 映射到参数。
public class InputBinding
{
public GameInputsEnum InputName { get; private set; }
public InputTypeEnum InputType { get; private set; }
public string InputButton { get; private set; }
public KeyCode InputKey { get; private set; }
public int InputMouseButton { get; private set; }
public InputBinding(GameInputsEnum inputName, InputTypeEnum inputType, string inputButton, KeyCode inputKey, int mouseButton)
{
this.InputName = inputName;
this.InputType = inputType;
this.InputButton = inputButton;
this.InputKey = inputKey;
this.InputMouseButton = mouseButton;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句