我可以排除基础 class 中的属性或字段,使其不被 Mongo DB C# 驱动程序序列化吗?
Can I exclude properties or fields in a base class from being serialized with Mongo DB C# driver?
我正在尝试序列化我拥有的 class 并将其保存到我拥有的 Mongo 数据库中。我遇到的问题是 class 我从另一个基础 class 继承自第 3 方库 (Unity3D)。 class 特别是 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 程序集中收到错误。
我知道这与我的基地有关 class 就好像我在我的数据库中查看文档一样,它现在有一些额外的 fields/properties 不在我的武器 class,但我知道是基础 class,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,
}
所以我想错误的发生是因为它试图将 enabled
和 useGUILayout
等 Monobehaviour 中存在的东西映射到我的武器 class 中不存在的属性。
考虑到我没有此 [=36] 的来源,我如何告诉 MongoDB 忽略此 Monobehaviour 基础 class 中的字段/属性=] - 它在我无法访问的 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>
另请注意,我已经通过将没有继承基础 class 的正常 class 保存到数据库并使用相同的逻辑将其反序列化回我的游戏来测试这一切是否有效我正在使用上面的内容。
是的,使用 ConventionPack
是可能的,尽管在这种情况下最好使用不同的模型并来回转换 - 毕竟,如果类型 新版本中的更改...
var pack = new ConventionPack();
pack.Add(new IgnoreExtraElementsConvention(true));
ConventionRegistry.Register("sloppy", pack,
t => typeof(MonoBehaviour).IsAssignableFrom(t));
编辑
我没有仔细看那个问题,抱歉。毕竟,值 是 存在于您的 class 中。问题是 MongoDB 不知道 class 继承,并且你不能用 [BsonDisriminator(Required=true)]
修饰基础 class。
虽然您也可以在运行时执行此操作,但使用外部 classes 进行序列化将是一个持续的痛苦之源,尤其是当他们决定以某些方式使 class 不可变时。我会使用一个单独的模型并来回使用地图,也许使用 AutoMapper 来避免愚蠢的复制代码。 (这是我在 5 分钟内第二次推荐 AutoMapper,但不,我没有任何关联...)
我正在尝试序列化我拥有的 class 并将其保存到我拥有的 Mongo 数据库中。我遇到的问题是 class 我从另一个基础 class 继承自第 3 方库 (Unity3D)。 class 特别是 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 程序集中收到错误。
我知道这与我的基地有关 class 就好像我在我的数据库中查看文档一样,它现在有一些额外的 fields/properties 不在我的武器 class,但我知道是基础 class,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,
}
所以我想错误的发生是因为它试图将 enabled
和 useGUILayout
等 Monobehaviour 中存在的东西映射到我的武器 class 中不存在的属性。
考虑到我没有此 [=36] 的来源,我如何告诉 MongoDB 忽略此 Monobehaviour 基础 class 中的字段/属性=] - 它在我无法访问的 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>
另请注意,我已经通过将没有继承基础 class 的正常 class 保存到数据库并使用相同的逻辑将其反序列化回我的游戏来测试这一切是否有效我正在使用上面的内容。
是的,使用 ConventionPack
是可能的,尽管在这种情况下最好使用不同的模型并来回转换 - 毕竟,如果类型 新版本中的更改...
var pack = new ConventionPack();
pack.Add(new IgnoreExtraElementsConvention(true));
ConventionRegistry.Register("sloppy", pack,
t => typeof(MonoBehaviour).IsAssignableFrom(t));
编辑
我没有仔细看那个问题,抱歉。毕竟,值 是 存在于您的 class 中。问题是 MongoDB 不知道 class 继承,并且你不能用 [BsonDisriminator(Required=true)]
修饰基础 class。
虽然您也可以在运行时执行此操作,但使用外部 classes 进行序列化将是一个持续的痛苦之源,尤其是当他们决定以某些方式使 class 不可变时。我会使用一个单独的模型并来回使用地图,也许使用 AutoMapper 来避免愚蠢的复制代码。 (这是我在 5 分钟内第二次推荐 AutoMapper,但不,我没有任何关联...)