繁体   English   中英

是否可以使用Mongo DB C#驱动程序序列化基类中的属性或字段?

[英]Can I exclude properties or fields in a base class from being serialized with Mongo DB C# driver?

我正在尝试序列化我拥有的一个类,并将其保存到我拥有的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,
}

因此,我想象发生错误是因为它试图将Monobehaviour中存在的事物(例如enableduseGUILayout到我的Weapon类中不存在的属性。

考虑到我没有此类的源代码(我无法访问的Unity3D库中的源代码),我如何告诉MongoDB在此Monobehaviour基类中专门忽略字段/属性?

这是我得到的错误:

(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>

还需要注意的是,我已经通过将不继承基类的普通类保存到数据库并将其反序列化回我的游戏中(使用与上述相同的逻辑)来测试了所有方法。

是的,使用ConventionPack可以实现,尽管在这种情况下,最好改用其他模型并来回转换-毕竟,如果新发行版中的类型发生更改 ,您会遇到麻烦...

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,但是不,我没有任何隶属关系...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM