簡體   English   中英

超過最大序列化深度

[英]Maximum serialization depth exceeded

嘗試在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);
}

更新:我注意到的一件事是,如果同一用戶嘗試在其范圍內添加注釋,則這是唯一一次出現此錯誤的情況。 如果其他用戶添加評論,則效果很好。 而且單元測試始終可以正常工作,無論是同一用戶還是其他用戶。

哇!

因此,我決定擺脫我遇到的錯誤,而是執行代碼清理。 這樣做時,我偶然發現了我一直忽略了一個清理項目,該項目是從代碼中刪除所有SomeAsyncTask.Wait()引用,並替換為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()參考,並找到一種使用await的方法(如果使用異步方法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM