2017-05-11 5 views
0

私は[ScriptIgnore]属性でいくつかのプロパティを持つオブジェクトをシリアル化しようとしています。しかし、時にはJavaScriptSerializerがその属性を持つのプロパティを無視しないようにしたい場合があります。 [ScriptIgnore]属性にもかかわらずオブジェクト全体を直列化する可能性はありますか?[ScriptIgnore]属性で修飾されたプロパティをシリアル化する方法はありますか?

public static string ConvertToJson(this object objectToConvert) 
{ 
    var serializer = new JavaScriptSerializer(); 
    return serializer.Serialize(objectToConvert); 
} 

public static void ConvertFromJson(this object objectToConvert, string jsonString) 
{ 
    var serializer = new JavaScriptSerializer(); 
    object dummy = serializer.Deserialize(jsonString, objectToConvert.GetType()); 

    foreach(PropertyInfo property in objectToConvert.GetType().GetProperties()) 
     if(property.CanRead && property.CanWrite && property.GetCustomAttribute<ScriptIgnoreAttribute>() == null) 
      property.SetValue(objectToConvert, property.GetValue(dummy)); 
} 

答えて

2

あなたはJavaScriptConverterオブジェクトをコード化して供給することにより、全体のシリアル化プロセスを制御することができます。

ここではいくつかのサンプルコードです。

public class TestObject 
{ 
    [ScriptIgnore] 
    public string TestString { get; set; } 
} 

...そして、それのインスタンスをシリアル化:テスト用

は、私たちはScriptIgnore属性で飾られている単一のプロパティで、この単純なクラスを使用してみましょう

var serializer = new JavaScriptSerializer(); 
Console.WriteLine(serializer.Serialize(new TestObject { TestString = "test" })); 

もちろん、プロパティは無視されます。出力:

{}

今、私たちはJavaScriptConverterを定義します。ここに関連する部分はSerialize()の私達の実装です:

public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
{ 
    var testObject = obj as TestObject; 

    if (testObject != null) 
    { 
     // Create the representation. This is a simplified example. 
     Dictionary<string, object> result = new Dictionary<string, object>(); 
     result.Add("TestString", testObject.TestString);   
     return result; 
    } 

    return new Dictionary<string, object>(); 
} 

我々は単に出力に無視プロパティを追加します。それでおしまい!

あなたはすべてをシリアル化したいときには、コンバータを提供したいです。コンバータを使用しない場合、デフォルトでは注釈付きプロパティは無視されます。

使用:

serializer.RegisterConverters(new List<JavaScriptConverter> { new TestObjectConverter() }); 

出力:

{ "たTestString": "テスト"}


完全なコードダンプ:

void Main() 
{ 
    var serializer = new JavaScriptSerializer(); 
    Console.WriteLine(serializer.Serialize(new TestObject { TestString = "test" })); // prints: {} 
    serializer.RegisterConverters(new List<JavaScriptConverter> { new TestObjectConverter() }); 
    Console.WriteLine(serializer.Serialize(new TestObject { TestString = "test" })); // prints: {"TestString":"test"} 
} 

public class TestObject 
{ 
    [ScriptIgnore] 
    public string TestString { get; set; } 
} 

public class TestObjectConverter : JavaScriptConverter 
{ 
    private static readonly IEnumerable<Type> supportedTypes = new List<Type> { typeof(TestObject) }; 

    public override IEnumerable<Type> SupportedTypes => supportedTypes; 

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
    { 
     var testObject = obj as TestObject; 

     if (testObject != null) 
     { 
      // Create the representation. This is a simplified example. You can use reflection or hard code all properties to be written or do it any other way you like - up to you. 
      Dictionary<string, object> result = new Dictionary<string, object>(); 
      result.Add("TestString", testObject.TestString);   
      return result; 
     } 

     return new Dictionary<string, object>(); 
    } 
} 
関連する問題