Превышена максимальная глубина сериализации - PullRequest
0 голосов
/ 30 апреля 2018

Я получаю сообщение об ошибке «Превышена максимальная глубина сериализации» при попытке отправить новые данные на MongoDB. При модульном тестировании на локальном хосте с сообществом 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);
}

ОБНОВЛЕНИЕ: Одна вещь, которую я заметил, это то, что если один и тот же пользователь пытается добавить комментарий в свой диапазон, это единственный раз, когда возникает эта ошибка. Если другой пользователь добавляет комментарий, он работает просто отлично. И модульный тест работает отлично все время, независимо от того, тот же пользователь или другой пользователь.

1 Ответ

0 голосов
/ 02 мая 2018

Wow!

Поэтому я решил отойти от полученной ошибки и вместо этого выполнить очистку кода. При этом я наткнулся на элемент очистки, который некоторое время игнорировал, который должен был удалить все ссылки 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 при использовании асинхронных методов.

...