Bson array (de)serialization with Json.NET
Set ReadRootValueAsArray to true on BsonReader
http://james.newtonking.com/projects/json/help/index.html?topic=html/P_Newtonsoft_Json_Bson_BsonReader_ReadRootValueAsArray.htm
This setting is required because the BSON data spec doesn't save metadata about whether the root value is an object or an array.
Hmmm, from where I sit, your code should work, but Json.Net seems to think that your serialized array of strings is a dictionary. This could be because, according to the BSON specification, arrays actually do get serialized as a list of key-value pairs just like objects do. The keys in this case are simply the string representations of the array index values.
In any case, I was able to work around the issue in a couple of different ways:
Deserialize to a Dictionary and then manually convert it back to an array.
var jsonSerializer = new JsonSerializer(); var array = new string[] { "A", "B" }; // Serialization byte[] bytes; using (var ms = new MemoryStream()) using (var bson = new BsonWriter(ms)) { jsonSerializer.Serialize(bson, array); bytes = ms.ToArray(); } // Deserialization using (var ms = new MemoryStream(bytes)) using (var bson = new BsonReader(ms)) { var dict = jsonSerializer.Deserialize<Dictionary<string, string>>(bson); array = dict.OrderBy(kvp => kvp.Key).Select(kvp => kvp.Value).ToArray(); }
Wrap the array in an outer object.
class Wrapper { public string[] Array { get; set; } }
Then serialize and deserialize using the wrapper object.
var jsonSerializer = new JsonSerializer(); var obj = new Wrapper { Array = new string[] { "A", "B" } }; // Serialization byte[] bytes; using (var ms = new MemoryStream()) using (var bson = new BsonWriter(ms)) { jsonSerializer.Serialize(bson, obj); bytes = ms.ToArray(); } // Deserialization using (var ms = new MemoryStream(bytes)) using (var bson = new BsonReader(ms)) { obj = jsonSerializer.Deserialize<Wrapper>(bson); }
Hope this helps.