Po uaktualnieniu podstawy kodu w celu użycia Json.NET 8.0.1, niektóre deserializacje potykają się. Korzystanie z Json.NET 7.0.1 wszystko działa dobrze. Najwyraźniej jest to deserializacja właściwości typu byte[]
, która powoduje problem. Jeśli usuniemy właściwość byte[]
, to działa poprawnie. mogę odtworzyć zachowanie przy użyciu tej prostej aplikacji konsoli:Nie można deserializować obiektu za pomocą właściwości tablicy bajtów za pomocą Json.NET 8.0.1
internal class Program
{
private static void Main(string[] args)
{
Dictionary<string, Account> accounts;
var jsonSerializerSettings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple
};
using (var streamReader = new StreamReader("accounts.json"))
{
var json = streamReader.ReadToEnd();
accounts = JsonConvert.DeserializeObject<Dictionary<string, Account>>(json, jsonSerializerSettings);
}
foreach (var account in accounts)
{
Debug.WriteLine(account.Value.Name);
}
}
}
internal class Account
{
public string Id { get; set; }
public string Name { get; set; }
public byte[] EncryptedPassword { get; set; }
}
Plik accounts.json
wygląda tak:
{
"$type": "System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[ConsoleApplication1.Account, ConsoleApplication1]], mscorlib",
"lars.michael": {
"$type": "ConsoleApplication1.Account, ConsoleApplication1",
"EncryptedPassword": {
"$type": "System.Byte[], mscorlib",
"$value": "cGFzc3dvcmQ="
},
"Name": "Lars Michael",
"Id": "lars.michael"
},
"john.doe": {
"$type": "ConsoleApplication1.Account, ConsoleApplication1",
"EncryptedPassword": {
"$type": "System.Byte[], mscorlib",
"$value": "cGFzc3dvcmQ="
},
"Name": "John Doe",
"Id": "john.doe"
}
}
Jest to prawdopodobnie błąd w Json.NET 8.0.1 czy mogę może rozwiązać ten problem przez ulepszenie JsonSerializerSettings
?
Jeśli ktokolwiek próbuje odtworzyć to, należy zsynchronizować nazwę zespołu w pliku accounts.json
z nazwą zespołu aplikacji konsoli (w tym przypadku ConsoleApplication1
).
fajne, dzięki za potwierdzenie i obejścia. Zgłosiłem problem na GitHub. –