我目前正在使用mongoDB存储播放器数据。我将播放器数据存储为类对象。 PlayerInfo类有几个与玩家有关的变量,例如他们的id,total,gold等。它还存储另一个类(字符库存)的列表,其中包含有关玩家所拥有的每个角色的信息。
当我尝试连接数据库并检索信息时,出现此错误:
异常:反序列化myCharsList时发生错误 类PlayerInfo的属性:
以下是连接数据库并检索有关播放器的信息的代码:
client = new MongoClient (connectionString);
server = client.GetServer ();
database = server.GetDatabase ("myDB");
playerCollection = database.GetCollection<PlayerInfo> ("Players");
try {
pInfo = playerCollection.AsQueryable<PlayerInfo>().Where<PlayerInfo>(player => player._id == "101112").SingleOrDefault();
totalGold = pInfo.totalGold;
myCharsList = pInfo.myCharsList;
Debug.Log ("GOT INFO FROM DATABASE");
} catch (Exception exx) {
Debug.Log ("Exception :" + exx.Message);
try {
pInfo = new PlayerInfo ();
pInfo._id = "101112";
pInfo.myCharsList = new List<myChar> ();
playerCollection.Insert (pInfo);
Debug.Log ("ADDED NEW PLAYER TO DATABASE");
} catch (Exception exxx) {
Debug.Log ("Failed to insert into collection of Database " + database.Name);
Debug.Log ("Error :" + exx.Message);
}
}
以下是我直接存储到mongoDB中的PlayerInfo类的代码:
public class PlayerInfo {
public List<myChar> myCharsList { get; set;}
public int totalGold { get; set;}
public int highScoreGems { get; set;}
public string _id = "101112";
public string playerName {get; set;}
public string email {get; set;}
public string password {get; set;}
}
存储在PlayerInfo类的列表中的类的代码是:
public class myChar : MonoBehaviour
{
public string namee;
public string tagg ;
public string rarity;
public int rarityInt;
public int level;
public int exp;
public int health;
public int attack;
public float speed;
}
从我的数据库图片中可以看到,数据库中存储了一切(我相信正确):
任何帮助将不胜感激!感谢
答案 0 :(得分:0)
我们无法看到MonoBehaviour中的内容,你在db中的myChar中有15个字段。所以,我认为可能有6个字段驻留在MonoBehaviour中。基本上,我建议通过数据类型和名称仔细查看字段是否匹配。如果序列化程序无法确定从mongo文档中放置字段的位置,则可能会出现此错误。
答案 1 :(得分:0)
希望您已经解决了问题。
首先,我将[BsonIgnoreExtraElements]
添加到您的 myChar 类中,只是要移走您对实现变幻不感兴趣的属性。
BsonIgnoreExtraElements
:指定在反序列化此类时是否应忽略其他元素。
[BsonIgnoreExtraElements]
public class myChar : MonoBehaviour
{
public string namee;
...
}
另一方面,我将仔细研究该类中的每种归档类型。
例如: 班级中的速度被定义为浮动,而数据库中的速度被存储为 Double 。 因此,例如,您可以在班级中将其设置为Double。
或者您可以使用 BsonRepresentation属性,以表示BSON文档中的值。这是另一个可能有用的选项,但我将首先检查每种类型是否正确匹配。
[BsonRepresentation(BsonType.Double)]
public float speed;