首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更改BSON格式的类型信息

更改BSON格式的类型信息
EN

Stack Overflow用户
提问于 2019-04-02 22:40:09
回答 1查看 54关注 0票数 0

因此,我有一些存储在数据库记录中的BSON数据,其中包含.NET类型信息(这是必要的,因为一些属性是接口,因此需要包括具体类型)。这一切都很好,但现在我不得不重新安排一些代码,以便将一些类移到不同的名称空间中。所以,举个例子:

代码语言:javascript
运行
复制
class MyClass
{
     public IFoo { get; set; }
}

使用IFoo的具体实现进行了组织序列化

代码语言:javascript
运行
复制
MyNameSpace.Foo

但现在是:

代码语言:javascript
运行
复制
SomeOtherNameSpace.Foo

无论哪种方式,类Foo都是相同的(尽管它可能有一些也发生了变化的嵌套属性)。

这对于新数据来说不是问题,但我需要找到一种方法来转换旧数据。问题是我目前不能反序列化旧的数据,因为它找不到相关的类,因为它们已经移动了。所以我想知道是否有一种方法可以改变保存在BSON中的类型信息而不需要反序列化它?我在想,即使我可以将BSON转换成JSON,我也可以用一些简单的字符串替换来编辑JSON (例如,用SomeOtherNameSpace替换MyNameSpace ),然后再转换回BSON并更新数据库记录。这是可以用JSON.Net实现的吗?我是否可以将BSON转换为JSON (不需要类对其进行反序列化),编辑JSON,然后再转换回BSON (使用现在更新的类型信息)?

EN

回答 1

Stack Overflow用户

发布于 2019-04-02 22:49:47

回答我自己的问题,这似乎是一个潜在的解决方案:

代码语言:javascript
运行
复制
JsonSerializer serializer = new JsonSerializer()
{
    TypeNameHandling = TypeNameHandling.None,  // make it ignore type handling for now
};
var dyn = serializer.Deserialize<dynamic>(reader);   // to a dynamic object
var str = (string)JsonConvert.SerializeObject(dyn);  // convert to JSON

// search and replace the old name space / assembly with the new
str = str.Replace("MyNameSpace.Foo, MyFirstAssembly",
          $"{typeof(Foo).FullName}, {typeof(Foo).Assembly.GetName().Name}");

// convert back to a dynamic object
dyn = JsonConvert.DeserializeObject<dynamic>(str);

var ms2 = new MemoryStream();
using (BsonWriter writer = new BsonWriter(ms2))
{
    // write it back to BSON
    serializer.Serialize(writer, dyn);
    // at this point we'd update the database record,
    // but to confirm we can now deserialize the updated data...
    ms2.Position = 0;
    using (var reader2 = new BsonReader(ms2))
    {
        // turn type handling back on
        serializer.TypeNameHandling = TypeNameHandling.All;
        tempResponse = serializer.Deserialize<MyClass>(reader2);  // success!
    }
}

它有点乱,但在紧要关头可能行得通,除非有一种更干净的方法来处理它?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55477463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档