【发布时间】:2018-08-30 21:14:15
【问题描述】:
我一直在尝试序列化和反序列化我的对象,以便我能够指定某些属性将被序列化但不被反序列化。
示例代码如下:
public interface ISupYo
{
string Hi { get; }
}
public class SupYo : ISupYo
{
public string Hi { get; } = "heya";
}
public interface ISup
{
int hiyo { get; }
}
public class Sup : ISup
{
public Sup(int hiyo)
{
this.hiyo = hiyo;
}
public int hiyo { get; }
public ISupYo yo => new SupYo();
}
var myNewSup = JsonConvert.SerializeObject(new Sup(2));
var mySup = JsonConvert.DeserializeObject<Sup>(myNewSup);
如果我从 Sup 类中删除构造函数,一切都会好起来的。
但由于 json.net 试图构造接口 ISupYo...,原样反序列化失败并出现以下错误...
Newtonsoft.Json.JsonSerializationException: 'Could not create an instance of type Scratchpad.Program+ISupYo. Type is an interface or abstract class and cannot be instantiated. Path 'yo.Hi', line 1, position 21.'
我尝试了这里的说明 Serialize Property, but Do Not Deserialize Property in Json.Net 但反序列化以同样的方式失败。
以这种方式使用 JsonConverter http://pmichaels.net/tag/type-is-an-interface-or-abstract-class-and-cannot-be-instantiated/ 是成功的,在序列化/反序列化期间指定 typeNameHandling 和格式处理也是如此
为什么使用/不使用默认构造函数之间会出现这种差异?
【问题讨论】:
-
你的序列化码是多少?究竟是什么失败了?
-
Sup中也需要添加无参数构造函数 -
请提供带有错误消息的minimal reproducible example。
-
@EhsanSajjad 这意味着如果我以无参数构造函数为目标,我将无法设置自动属性 Sup.hiyo
-
@dbc 我不太确定我是否遵循,我习惯于拥有多个构造函数,使用 [JsonConstructor] 属性并以这种方式设置自动属性,这就是一个构造函数会发生的情况在这个例子中。但是我不明白为什么 ISupYo 类型的属性 yo 被拖入混合中,然后导致异常(尽管我知道这与它首先被序列化的事实有关)
标签: c# json serialization json.net