在C#MongoDB

时间:2018-04-16 02:08:48

标签: c# mongodb dictionary serialization

我正在为包含<string, object>字典的类实现自定义序列化程序,其唯一目的是删除序列化_t附带的_vobject字段默认情况下(我不关心反序列化)。

以下是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仍然是唯一对我有意义的事情,但它不起作用。

0 个答案:

没有答案
相关问题