Я отслеживал ошибку, и я заметил, что Newtonsoft JSON добавит элементы к List<>
, которые были инициализированы в конструкторе по умолчанию. Я немного поработал и обсудил с некоторыми людьми в чате C#, и мы заметили, что это поведение не распространяется на все другие типы коллекций.Пояснение для ObjectCreationHandling с использованием Newtonsoft JSON?
https://dotnetfiddle.net/ikNyiT
using System;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Collections.ObjectModel;
public class TestClass
{
public Collection<string> Collection = new Collection<string>(new [] { "ABC", "DEF" });
public List<string> List = new List<string>(new [] { "ABC", "DEF" });
public ReadOnlyCollection<string> ReadOnlyCollection = new ReadOnlyCollection<string>(new [] { "ABC", "DEF" });
}
public class Program
{
public static void Main()
{
var serialized = @"{
Collection: [ 'Goodbye', 'AOL' ],
List: [ 'Goodbye', 'AOL' ],
ReadOnlyCollection: [ 'Goodbye', 'AOL' ]
}";
var testObj = JsonConvert.DeserializeObject<TestClass>(serialized);
Console.WriteLine("testObj.Collection: " + string.Join(",", testObj.Collection));
Console.WriteLine("testObj.List: " + string.Join(",", testObj.List));
Console.WriteLine("testObj.ReadOnlyCollection: " + string.Join(",", testObj.ReadOnlyCollection));
}
}
Выход:
testObj.Collection: ABC,DEF
testObj.List: ABC,DEF,Goodbye,AOL
testObj.ReadOnlyCollection: Goodbye,AOL
Как вы можете видеть Collection<>
свойство не зависит от десериализации List<>
добавляется и ReadOnlyCollection<>
заменяется. Это намеренное поведение? Каковы были рассуждения?
Я подозреваю, что ответ будет «просто потому, что», также было бы интересно узнать, есть ли причина поведения для List/Collection (поведение ReadOnlyCollection несколько самоочевидно с моей точки зрения). Боковое замечание: подумайте о том, чтобы обновить название, чтобы быть более конкретным - «любопытно» несколько сложно догадаться, если бы захотелось найти это на основе проблемы ... –
@AlexeiLevenkov - У меня возникают некоторые проблемы с выяснением нюансов между ReadOnlyCollection и Collection. Проблема, похоже, связана с параметром ObjectCreationHandling, поэтому я добавил это в заголовок. –
Эта проблема также обсуждалась в [C# чате] (http://chat.stackoverflow.com/transcript/message/20857312#20857312). –