Cosmonaut(CosmosDb)-序列化问题

时间:2019-11-02 18:53:36

标签: c# azure-cosmosdb azure-cosmosdb-sqlapi cosmos

我有一个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类型的实例。      类型是接口或抽象类,不能实例化。”   在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateNewObject(JsonReader reader,JsonObjectContract objectContract,   JsonProperty containerMember,JsonProperty containerProperty,字符串ID,布尔值和createdFromNonDefaultCreator)\ r \ n      在...

我想知道如何解决这个问题?有人有建议吗?

1 个答案:

答案 0 :(得分:1)

'解串器无法解析抽象类的接口。但是,一种解决方案是将$type属性添加到您的FooResult中,并将其用于反序列化。

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

您的FooResult的Json对象现在必须包含$type属性,如

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