我正在为这个asp.net webapi output cache实现一个mongodb缓存(我同意redis会更好/更快但是现在,我需要一个mongodb实现!)
反正
我有一个CachedItem
类来保存我的键/值:
[BsonIgnoreExtraElements]
public class CachedItem
{
[BsonElement("key")]
public string Key { get; set; }
[BsonElement("value")]
public object Value { get; set; }
}
价值是一个对象,可能是任何东西,我们无法控制它。
在我的一项测试中,我有一个非常简单的poco:
public class UserFixture
{
public UserFixture()
{
Id = Guid.NewGuid();
}
public Guid Id { get; set; }
public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
}
当此项设置为Value
时,它会被序列化并保留。
当我尝试检索它时,它无法反序列化,因为它已自动获取“Id”属性。
反序列化类WebAPI.OutputCache.MongoDb.Tests.UserFixture的Id属性时发生错误:无法从BsonType ObjectId反序列化Guid
显然,我无法装饰UserFixture
有什么方法可以告诉MongoDB驱动程序基本上序列化CachedItem.Value,比如一个字符串?
我可以使用JSON.net在保存之前执行此操作,并在退回的路上反序列化,但我希望避免这种情况。
It's also on GitHub 如果您想尝试失败的测试,那么该链接应该会直接进入相关提交。
答案 0 :(得分:1)
您当然可以通过构建自己的自定义MongoDB
告诉BsonSerializer
将您的类序列化为字符串。我发现从BsonStringSerializer
继承更容易。您还需要使用您的特定类型注册该序列化程序。 (我建议使用BsonSerializationProvider
)
您需要考虑的是如何将所有可能的数据表示为字符串,以便将其反序列化回应用程序(例如,考虑您可能需要保存类型信息)。