У меня проблема с использованием JsonSerializer.Serialize для сохранения словаря в файл: он не примет мой объект один (реализация для двух аргументов использует тип в качестве второго аргумента, и когда я пытаюсь использовать тип словаря, он говорит, что это не соответствует требованиям).
Я читаю это:
https://docs.microsoft.com/fr-fr/dotnet/api/system.text.json.jsonserializer.serialize?view=net-7.0;
https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/how-to?pivots=dotnet-6-0;
JsonConvert.SerializeObject против JsonSerializer.Serialize
https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/supported-collection-types?pivots=dotnet-7-0
Но не могу понять, что я делаю не так. Не могли бы вы объяснить мне?
Спасибо
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Text.Json; //JsonSerializer;
namespace Modules;
public class Tracker : ModuleBase<SocketCommandContext>
{
internal static Dictionary<int, SortedSet<string>> playerTracker=
new Dictionary<int,SortedSet<string>>{};
[Command("w")]
[Summary("write current tracker to file")]
public async Task saveTracker ()
{
Console.WriteLine(JsonSerializer.Serialize(playerTracker));
Console.WriteLine(playerTracker);
using (StreamWriter file = File.CreateText(@"playerTracker.json"))
{
//JsonSerializer.Serialize(file,playerTracker, Dictionary<int, SortedSet<string>>);
//CS0119
JsonSerializer.Serialize(file,playerTracker);
//CS1503 (arg 2) impossible to convert 'System.Collections.Generic.Dictionary<int, System.Collections.Generic.SortedSet<string>>' as 'System.Type'
}
}
}
Похоже, вы передаете StreamWriter, где перегрузка, которую вы пытаетесь вызвать, принимает Stream
. Это сбивает с толку компилятор, потому что он предполагает, что вы пытаетесь использовать одну из перегрузок, которая принимает object
для сериализации в качестве первого аргумента. Поэтому он сообщает о проблеме с вашим вторым аргументом, потому что это не то, что было бы разрешено любой из этих перегрузок.
Попробуйте использовать File.Create вместо File.CreateText.
using (FileStream file = File.Create(@"playerTracker.json"))
Я обнаружил: почему-то Deserialize(Stream, Type, JsonSerializerOptions) не работает, но Deserialize<TValue>(Stream, JsonSerializerOptions) работает. Ненавижу, когда не понимаю почему, но это работает. Еще раз спасибо.
Спасибо, это работает. Я заменил Streamwriter на FileStream, как предлагалось когда-то заменить File.CreateText на File.Create, и теперь вроде работает (по крайней мере, компилятор не путается). У меня похожая проблема с Deserialize(stream,Dictionary<int, SortedSet<string>>); но я разберусь с этим