Космонавт (CosmosDb) - проблема с сериализацией - PullRequest
1 голос
/ 02 ноября 2019

У меня есть класс POCO, как показано ниже. Что это за IFooInterface? это интерфейс, который каждый объект, который хочет добавить в Cosmosdb, должен наследовать от этого. (Основная причина этого факта в том, что у нас есть другой тип результатов)

[CosmosCollection("foo")]
public class FooClass 
{
    [CosmosPartitionKey]
    [JsonProperty("foo")] public string Foo{ get; set; }

    [JsonProperty("id")] public string Id{ get; set; }

    [JsonProperty("reportSet")] public IFooInterface FooResult { get; set; }
}

public interface IFooInterface {}

, и у меня есть репозиторий, который помогает вернуть эти результаты. Моя проблема в том, что в методе ниже я получил ошибку. Вот метод в репозитории

    public async Task<IEnumerable<objectClass>> GetAsync(GetObjects query)
    {
        try
        {
            var testOne= await _reportStore
                .Query(new FeedOptions { PartitionKey = new PartitionKey(query.foo) })
                .ToListAsync();
            return result;
        }
        catch (Exception e)
        {
            throw e;
        }
    }

И ошибка:

Message = "Не удалось создать экземпляр типа IFooInterface. Тип является интерфейсом или абстрактным классом и не может бытьэкземпляр «. StackTrace = "at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateNewObject (считыватель JsonReader, JsonObjectContract objectContract, контейнер-элемент JsonProperty, идентификатор контейнера JsonProperty, идентификатор строки, логический и созданный * 101 *

1011 \ n1 ...)Интересно, как я могу решить эту проблему? У кого-нибудь есть какие-либо предложения?

1 Ответ

1 голос
/ 03 ноября 2019

'Десериализатор не способен разрешать интерфейсы или абстрактные классы. Однако решение может состоять в том, чтобы добавить свойство $type в FooResult и использовать его для десериализации.

[JsonProperty(PropertyName = "reportSet", TypeNameHandling = TypeNameHandling.Objects)]
public IFooInterface FooResult { get; set; }

Ваш объект Json в FooResult теперь должен содержать свойство $type, например

{ "$type" : "someNamespace.FooInterfaceImplementation, assemblyOfTheClass" }
...