列表c#的MongoDB反序列化错误

时间:2017-04-20 16:38:22

标签: c# mongodb deserialization

我目前正在使用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;
}

从我的数据库图片中可以看到,数据库中存储了一切(我相信正确):enter image description here

任何帮助将不胜感激!感谢

2 个答案:

答案 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;