独立地或作为字符串序列化嵌入的类/对象?

时间:2014-02-05 19:08:05

标签: c# .net mongodb mongodb-.net-driver

我正在为这个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 如果您想尝试失败的测试,那么该链接应该会直接进入相关提交。

1 个答案:

答案 0 :(得分:1)

您当然可以通过构建自己的自定义MongoDB告诉BsonSerializer将您的类序列化为字符串。我发现从BsonStringSerializer继承更容易。您还需要使用您的特定类型注册该序列化程序。 (我建议使用BsonSerializationProvider

您需要考虑的是如何将所有可能的数据表示为字符串,以便将其反序列化回应用程序(例如,考虑您可能需要保存类型信息)。