在尝试在MongoDB上推送新数据时,我收到错误“超出最大序列化深度”。使用MongoDB社区对localhost进行单元测试时,它没有问题。任何帮助,将不胜感激。我也没有看到循环参考。
这是启动数据保存的功能。首先是我的本地缓存然后是云(MongoDB)。
///Calling function
public async Task AddComment(Range item, Comment commentItem)
{
try
{
//Save to local cache
item.Comments.Add(commentItem);
//Next save to cloud
await CloudStorage.AddComment(item.User.ID, item.ID, commentItem);
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
}
//-->ERROR HAPPENS LAST LINE HERE<--
public async Task<UpdateResult> AddComment(string ownerID, string rangeID, Comment comment)
{
var filter = Builders<User>.Filter.Where(u => u.ID == ownerID &&
u.Content.Any(i => i.ID == rangeID));
var update = Builders<User>.Update.Push(c => c.Content[-1].Comments, comment);
return await collection.UpdateOneAsync(filter, update); //<- THIS THROWS ERROR
}
这是与localhost一起使用的单元测试。
[TestMethod]
public void TestInsertComment()
{
//Arrange
var owner = "OWNER";
var ownerData = collection.Find(u => u.Username.Equals(owner)).FirstOrDefault();
var ownerID = ownerData?.ID;
var range = ownerData?.Content.FirstOrDefault();
var newComment = new Comment
{
User = range?.User,
Content = "Some comment",
IsLive = true
};
//Act
var results = _cloudStorageService.AddComment(ownerID, range?.ID, newComment);
results.Wait();
var insertedID = collection.Find(u => u.Username.Equals(owner))
.FirstOrDefault().Content.FirstOrDefault()?
.Comments.FirstOrDefault(c => c.ID.Equals(newComment.ID))?.ID;
//Assert
Assert.AreEqual(newComment.ID, insertedID);
}
更新:我注意到的一件事是,如果同一个用户尝试在其范围内添加评论,则这是此错误发生的唯一时间。如果其他用户添加评论,它就可以正常工作。无论是用户还是其他用户,单元测试都能正常运行。
答案 0 :(得分:0)
哇!
所以我决定放弃我遇到的错误并执行代码清理。在这样做的过程中,我偶然发现了一个我一直忽略的清理项目,即从代码中删除所有SomeAsyncTask.Wait()引用并替换为等待SomeAsyncTask。好吧,这样做,我发现了这个小金块:
var commentItem = new Comment
{
User = GetCurrentUserExtData(),
Content = NewCommentText
}
public User GetCurrentUserExtData(string ID = null)
{
var user = new User();
var data = DataStore.GetUser(ID);
data.Wait();
user = data.Result;
return user;
}
GetCurrentUserExtData中包含SomeAsyncTask.Wait()任务。将其更改为:
var commentItem = new Comment
{
Content = NewCommentText,
User = await DataStore.GetUser()
}
没有更多的最大序列化深度超出错误!我完全没有想到会有什么相关但却是!不用说,删除所有.WAIT()参考并找到一种方法来使用等待,如果使用异步方法。