我正在为包含<string, object>
字典的类实现自定义序列化程序,其唯一目的是删除序列化_t
附带的_v
和object
字段默认情况下(我不关心反序列化)。
以下是object
值为字符串数组时的示例:
class MyClass {
Dictionary<string, object> maps;
}
class MySerializer : SerializerBase<MyClass> {
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, MyClass value) {
context.Writer.WriteStartDocument();
context.Writer.WriteName("Maps");
foreach (var kvp in value.maps) {
context.Writer.WriteStartDocument();
context.Writer.WriteName(kvp.Key);
Type t = kvp.Value.GetType();
if (t == typeof(string[])) {
context.Writer.WriteStartArray();
foreach (string s in (string[])kvp.Value) {
context.Writer.WriteString(s);
}
context.Writer.WriteEndArray();
}
else {
// More type checks here
}
context.Writer.WriteEndDocument();
}
context.Writer.WriteEndDocument();
}
预期/期望的输出:
Maps: {
key1: [value11, value12, value3],
key2: [value21, value22, value23]
}
但是,我得到的只是一个错误,说我不能使用WriteStartDocument()
:
System.InvalidOperationException:'WriteStartDocument只能是 当State为Initial或Value或ScopeDocument或Done时调用,而不是 当State为Name'
时
如何做到这一点?
编辑:经过5个多小时的搜索,尝试代码,然后最终发布此问题,我会重新审视我已查看的答案,然后发现它可以是适用于我的情况。添加到this解决方案:
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, MyClass value) {
var jsonDoc = Newtonsoft.Json.JsonConvert.SerializeObject(value);
var bsonDoc = BsonSerializer.Deserialize<BsonDocument>(jsonDoc);
bsonDoc.Remove("Id"); // Remove unnecessary ID field that gets generated from the JSON
RawBsonDocument rawDoc = new RawBsonDocument(bsonDoc.ToBson());
context.Writer.WriteRawBsonDocument(rawDoc.Slice);
}
那就是说,我仍然很好奇我们如何手动序列化到嵌套地图。在WriteStartDocument
之后WriteName
仍然是唯一对我有意义的事情,但它不起作用。