我可以排除基类中的属性或字段使用Mongo DB C#驱动程序进行序列化吗?

时间:2015-02-12 21:28:54

标签: c# mongodb

我正在尝试序列化我拥有的类并将其保存到我拥有的Mongo数据库中。我遇到的问题是我从第三方库(Unity3D)继承了另一个基类。该课程特别是MonoBehaviour。

示例:

public class Weapon : MonoBehaviour
{
    public bool PreviewEnabled;

    public float Spread { get; set; }

    public float Spacing { get; set; }

    public int Count { get; set; }

    public float Chaos { get; set; }
}

因此,这可以毫无问题地保存到我的数据库中,但是当我尝试反序列化并将其转换回Weapon实例时,我从MongoDB程序集中收到错误。

我知道这与我的基类有关,就像我查看我的数据库中的文档一样,它现在有一些额外的字段/属性,不在我的Weapon类中,但我知道是其中的一部分基础班,Monobehaviour。以下是一个保存文档的示例:

{
    "_id": {
        "$oid": "54dd153596a433238cd3ea42"
    },
    "name": "PlayerPreview",
    "hideFlags": 0,
    "active": true,
    "tag": "Player",
    "enabled": true,
    "useGUILayout": true,
    "PreviewEnabled": true,
    "Spread": 0,
    "Spacing": 1,
    "Count": 2,
    "Chaos": 0,
}

所以我想象错误的发生是因为它试图将enableduseGUILayout等Monobehaviour中存在的东西映射到我的武器类中不存在的属性。

我怎么能告诉MongoDB忽略这个Monobehaviour基类中的字段/属性,考虑到我没有这个类的源代码 - 它在我无法访问的Unity3D库中? /强>

这是我得到的错误:

(System.Runtime.CompilerServices.ExecutionScope,object,object) <IL 0x00016, 0x0007f>
MongoDB.Bson.Serialization.BsonClassMapSerializer.Deserialize (MongoDB.Bson.IO.BsonReader,System.Type,System.Type,MongoDB.Bson.Serialization.IBsonSerializationOptions) <IL 0x00183, 0x00967>
MongoDB.Bson.Serialization.BsonClassMapSerializer.Deserialize (MongoDB.Bson.IO.BsonReader,System.Type,MongoDB.Bson.Serialization.IBsonSerializationOptions) <IL 0x0004d, 0x001e7>
MongoDB.Driver.Internal.MongoReplyMessage`1<Weapon>.ReadFrom (MongoDB.Bson.IO.BsonBuffer,MongoDB.Bson.Serialization.IBsonSerializationOptions) <0x00772>
MongoDB.Driver.Internal.MongoConnection.ReceiveMessage<Weapon> (MongoDB.Bson.IO.BsonBinaryReaderSettings,MongoDB.Bson.Serialization.IBsonSerializer,MongoDB.Bson.Serialization.IBsonSerializationOptions) <0x0030d>

另外需要注意的是,我已经测试过这一切都可以通过将没有基类继承的普通类保存到数据库并使用我上面使用的相同逻辑将其反序列化回我的游戏。

1 个答案:

答案 0 :(得分:2)

是的,可以使用ConventionPack,但在这种情况下使用不同的模型并在此情况下来回转换可能会更好 - 毕竟,如果类型发生变化,则会遇到麻烦/ em>在新版本中......

var pack = new ConventionPack();
pack.Add(new IgnoreExtraElementsConvention(true));
ConventionRegistry.Register("sloppy", pack, 
                             t => typeof(MonoBehaviour).IsAssignableFrom(t));

修改

我没有仔细阅读这个问题,抱歉。毕竟,您的班级中的值 。问题是MongoDB不知道类继承,你不能用[BsonDisriminator(Required=true)]来装饰基类。

虽然您也可以在运行时执行此操作,但使用外部类进行序列化将是一个持续的痛苦来源,特别是如果他们决定以某种方式使类不可变。我会使用一个单独的模型并来回使用地图,可能使用AutoMapper来避免愚蠢的复制代码。 (这是我第二次在5分钟内推荐AutoMapper,但是没有,我没有任何关联......)