Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JSON.Net-类类型序列化为类型名而不是值的属性_C#_Winforms_Json.net_Propertygrid - Fatal编程技术网

C# JSON.Net-类类型序列化为类型名而不是值的属性

C# JSON.Net-类类型序列化为类型名而不是值的属性,c#,winforms,json.net,propertygrid,C#,Winforms,Json.net,Propertygrid,当我尝试使用JSON.net来序列化我的自定义数据类时,我遇到了一个问题-基本类型的属性被正确序列化,但是类本身的属性将被序列化为字符串(完整类型名,没有其他内容,没有实际值) 类类型通过Assembly.LoadFrom(文件)动态加载,然后,属性类型被TypeDescriptor.AddAttributes修饰以添加ExpandableObjectConverter-这允许WinForms属性网格控件展开它们并设置它们的内部值。这里的问题确实是TypeConverter[typeof(Exp

当我尝试使用
JSON.net
来序列化我的自定义数据类时,我遇到了一个问题-基本类型的属性被正确序列化,但是类本身的属性将被序列化为字符串(完整类型名,没有其他内容,没有实际值)


类类型通过
Assembly.LoadFrom(文件)
动态加载,然后,属性类型被
TypeDescriptor.AddAttributes
修饰以添加
ExpandableObjectConverter
-这允许
WinForms属性网格
控件展开它们并设置它们的内部值。

这里的问题确实是
TypeConverter[typeof(ExpandableObjectConverter)]
。JSON.Net的DefaultContractResolver将检索类型转换器并调用CanConvertTo(typeof(string)),后者将返回true,因此它将对该类型使用StringContract—它将被序列化为字符串

第一个解决方案来自JSON.Net端——如前所述实现您自己的ContractResolver。 然后,您可以像这样重写CreateContract,并始终为使用TypeConverter属性修饰的类型提供正确的契约:

protected override JsonContract CreateContract(Type objectType)
{
   if (TypeDescriptor.GetAttributes(objectType).Contains(new TypeConverterAttribute(typeof(ExpandableObjectConverter))))
   {
       return this.CreateObjectContract(objectType);
   }

   return base.CreateContract(objectType);
}

第二个解决方案是创建自己的扩展对象转换器,并重写它的CANEngReTTO方法,以返回字符串的false。这是JSON.NET调用的,因此不认为它是String合同,并将返回到ObjutsCurror。 这里的问题确实是

TypeConverter[typeof(ExpandableObjectConverter)]
。JSON.Net的DefaultContractResolver将检索类型转换器并调用CanConvertTo(typeof(string)),后者将返回true,因此它将对该类型使用StringContract—它将被序列化为字符串

第一个解决方案来自JSON.Net端——如前所述实现您自己的ContractResolver。 然后,您可以像这样重写CreateContract,并始终为使用TypeConverter属性修饰的类型提供正确的契约:

protected override JsonContract CreateContract(Type objectType)
{
   if (TypeDescriptor.GetAttributes(objectType).Contains(new TypeConverterAttribute(typeof(ExpandableObjectConverter))))
   {
       return this.CreateObjectContract(objectType);
   }

   return base.CreateContract(objectType);
}

第二个解决方案是创建自己的扩展对象转换器,并重写它的CANEngReTTO方法,以返回字符串的false。这是JSON.NET调用的,因此不认为它是String合同,并将返回到ObjutsCurror。