因此,我有一些存储在数据库记录中的BSON数据,其中包含.NET类型信息(这是必要的,因为一些属性是接口,因此需要包括具体类型)。这一切都很好,但现在我不得不重新安排一些代码,以便将一些类移到不同的名称空间中。所以,举个例子:
class MyClass
{
public IFoo { get; set; }
}使用IFoo的具体实现进行了组织序列化
MyNameSpace.Foo但现在是:
SomeOtherNameSpace.Foo无论哪种方式,类Foo都是相同的(尽管它可能有一些也发生了变化的嵌套属性)。
这对于新数据来说不是问题,但我需要找到一种方法来转换旧数据。问题是我目前不能反序列化旧的数据,因为它找不到相关的类,因为它们已经移动了。所以我想知道是否有一种方法可以改变保存在BSON中的类型信息而不需要反序列化它?我在想,即使我可以将BSON转换成JSON,我也可以用一些简单的字符串替换来编辑JSON (例如,用SomeOtherNameSpace替换MyNameSpace ),然后再转换回BSON并更新数据库记录。这是可以用JSON.Net实现的吗?我是否可以将BSON转换为JSON (不需要类对其进行反序列化),编辑JSON,然后再转换回BSON (使用现在更新的类型信息)?
发布于 2019-04-02 22:49:47
回答我自己的问题,这似乎是一个潜在的解决方案:
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!
}
}它有点乱,但在紧要关头可能行得通,除非有一种更干净的方法来处理它?
https://stackoverflow.com/questions/55477463
复制相似问题