2016-04-15 78 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

很高興知道! –