私はバグを追跡していましたが、Newtonsoft JSONがデフォルトのコンストラクタで初期化されたList<>
にアイテムを追加することに気付きました。私はもう少し掘り下げて、C#のチャットでいくつかの人々と議論し、この動作は他のすべてのコレクションタイプには当てはまらないことに気付きました。 Newtonsoft JSONを使用したObjectCreationHandlingについての説明?
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));
}
}
出力:あなたはCollection<>
プロパティは、逆シリアル化の影響を受けないで見ることができるように
testObj.Collection: ABC,DEF
testObj.List: ABC,DEF,Goodbye,AOL
testObj.ReadOnlyCollection: Goodbye,AOL
、List<>
がに追加され、ReadOnlyCollection<>
が交換されます。これは意図された動作ですか?推論は何でしたか?
私は、List/Collection(ReadOnlyCollectionの振る舞いは私の視点からやや自明である)の振る舞いの裏側に理由があるかどうかを知ることは興味深いと思う。サイドノート:タイトルをより具体的に更新することを検討してください - 問題に基づいてこれを見つけたいと思うのであれば、 "好奇心"はやや難しいでしょう... –
@AlexeiLevenkov - 私はReadOnlyCollectionとCollectionの間のニュアンスを考えています。問題はObjectCreationHandlingの設定にあるように見えるので、タイトルに追加しました。 –
この問題は、[c#チャットルーム](http://chat.stackoverflow.com/transcript/message/20857312#20857312)でも議論されています。 –