2016-04-15 52 views
1

ProcessStartInfoJSON.NET序列化的ProcessStartInfo

ProcessStartInfo psi = new ProcessStartInfo() 
{ 
    FileName = "path", 
    Arguments = "args", 
    UseShellExecute = false, 
    RedirectStandardError = true, 
    CreateNoWindow = true, 
    Verb = "runas" 
}; 

类的对象和记录的目的我想它序列化到JSON。 我的代码:

string json = JsonConvert.SerializeObject(psi); 

json包含:

“System.Diagnostics.ProcessStartInfo”

如何序列化属性这一翻译键入的名字吗?

+2

这是因为'ProcessStartInfo'上的[TypeConverter(typeof(ExpandableObjectConverter))]'属性。看看例如[Newtonsoft json序列化程序返回空对象](http://stackoverflow.com/questions/11044639/newtonsoft-json-serializer-returns-empty-object)。 – CodeCaster

+0

@CodeCaster谢谢。我需要在一个地方。自己的ContractResolver是太多的工作;-)在这个JSON.NET中没有切换? – BWA

回答

3

由于@CodeCaster在注释中指定,问题出在[TypeConverter(typeof(ExpandableObjectConverter))],您需要为该'ExpandableObjectConverter'属性创建新的JsonObjectContract分配给类型。

新合同解析器可以有“ExpandableObjectConverter” attibute类型创建:

public class SerializableExpandableContractResolver : DefaultContractResolver 
    { 
     protected override JsonContract CreateContract(Type objectType) 
     { 
      if (TypeDescriptor.GetAttributes(objectType).Contains(new TypeConverterAttribute(typeof(ExpandableObjectConverter)))) 
      { 
       return CreateObjectContract(objectType); 
      } 
      return base.CreateContract(objectType); 
     } 
    } 

现在,您可以使用上述合同的解析器,而在下面的方式串行化:

string json = JsonConvert.SerializeObject(psi, 
       new JsonSerializerSettings() {ContractResolver = new SerializableExpandableContractResolver()}); 
+0

谢谢,这是有效的。基于@CodeCaster评论我写了类似的:-) – BWA

+0

很高兴知道! –