超出最大序列化深度
Maximum serialization depth exceeded
尝试在 MongoDB 上推送新数据时出现错误 "maximum serialization depth exceeded"。当使用 MongoDB 社区在本地主机上进行单元测试时,它可以正常工作。任何帮助,将不胜感激。我也没有看到循环引用。
这是开始保存数据的功能。首先到我的本地缓存,然后到云 (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);
}
更新: 我注意到的一件事是,如果同一个用户试图向他们的范围添加评论,那是唯一一次发生此错误。如果另一个用户添加评论,它就可以正常工作。而且无论是同一用户还是其他用户,单元测试始终运行良好。
哇!
所以我决定摆脱我遇到的错误,转而执行代码清理。在这样做时,我偶然发现了一个我已经忽略了一段时间的清理项目,它是从代码中删除所有 SomeAsyncTask.Wait() 引用并替换为 await 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() 引用并找到使用 await 的方法。
尝试在 MongoDB 上推送新数据时出现错误 "maximum serialization depth exceeded"。当使用 MongoDB 社区在本地主机上进行单元测试时,它可以正常工作。任何帮助,将不胜感激。我也没有看到循环引用。
这是开始保存数据的功能。首先到我的本地缓存,然后到云 (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);
}
更新: 我注意到的一件事是,如果同一个用户试图向他们的范围添加评论,那是唯一一次发生此错误。如果另一个用户添加评论,它就可以正常工作。而且无论是同一用户还是其他用户,单元测试始终运行良好。
哇!
所以我决定摆脱我遇到的错误,转而执行代码清理。在这样做时,我偶然发现了一个我已经忽略了一段时间的清理项目,它是从代码中删除所有 SomeAsyncTask.Wait() 引用并替换为 await 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() 引用并找到使用 await 的方法。