Я пытаюсь протестировать сериализацию для приведенного ниже примера, но в итоге я получил эту ошибку Newtonsoft.Json.JsonSerializationException : Could not create an instance of type Core.Model.Assets.Asset. Type is an interface or abstract class and cannot be instantiated. Path '_source.articleAssets[0].asset.refId'
. В приведенном ниже примере Asset
является абстрактным классом, и есть более чем в 5 производных классов (например: BrightcoveVideo
является одним из производного класса)Newtonsoft.Json.JsonSerializationException: Не удалось создать экземпляр типа (абстрактный класс)
ArticleAssets = new List<ArticleAsset>()
{
new ArticleAsset()
{
ArticleId = 1,
Asset = new BrightcoveVideo()
{
AssetType = AssetTypeEnum.BrightcoveTitle, Id = 11, Name = "something for a name", DisplayName = "some display", RefId = "refrefref"
},
AssetId = 11,
AssetType = AssetTypeEnum.BrightcoveTitle
}
}
У меня есть пользовательский класс JsonConverter который выглядит следующим образом:
public class AssetTypeConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Asset) || objectType == typeof(SearchResultAsset);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value != null && value.GetType() == typeof(SearchResultAsset))
{
throw new NotImplementedException("WriteJson unexpectedly called for SearchResultAsset in AssetTypeConverter");
}
throw new NotImplementedException("WriteJson unexpectedly called for Asset in AssetTypeConverter");
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}
Asset concreteAsset = new SearchResultAsset();
serializer.Populate(reader, concreteAsset);
return concreteAsset;
}
}
в классе ElasticSearchRegistry, я добавляю этот конвертер следующим образом:
var connectionSettings = new ConnectionSettings(connectionUri);
_elasticClient = new ElasticClient(connectionSettings);
connectionSettings.SetJsonSerializerSettingsModifier(p => p.Converters.Add(new AssetTypeConverter()));
Я понимаю, что JsonSerialization кроме ионов при следующих Get
запрос:
public IGetResponse<Article> GetArticleResponse(int id)
{
var response = _elasticClient.Get<Article>(i => i.Index(_indexName)
.Type(DocumentType)
.Id(id)
);
return response;
}
Я получил это фиксировано, это было очень маленькие mistake.I установили JsonSerializerSettings перед тем инстанцировании 'ElasticClient' так:' connectionSettings = новые ConnectionSettings (ConnectionUri); connectionSettings. SetJsonSerializerSettingsModifier (p => p.Converters.Add (новый AssetTypeConverter()); _ elasticClient = новый ElasticClient (connectionSettings); ' – user2768439
вы можете разместить его в качестве ответа –