2016-11-23 3 views
1

Ich habe eine Klasse wie folgt Serialisierung:Wie eine Eigenschaft als Objekt auf der Grundlage des tatsächlichen Art des Wertes ignorieren, wenn sie mit einem benutzerdefinierten ContractResolver

class Test 
{ 
    public object Obj { get; set; } 
} 

Manchmal Obj den Wert eines nicht serialisierbaren Typen hat, wie zum Beispiel: byte[] oder SqlDataReader.

Ich habe versucht, eine benutzerdefinierte ContractResolver zu machen, um die Eigenschaft zu ignorieren, wenn der Wert byte[] ist. Aber es funktioniert nicht: der Eigenschaftstyp ist immer noch Object, nicht byte[].

public class AutoIgnoreComplexTypesContractResolver : DefaultContractResolver 
{ 
    private static readonly List<Type> IgnoredTypes = new List<Type>() 
    { 
     typeof(byte[]), 
     typeof(SqlDataReader) 
    }; 

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     var property = base.CreateProperty(member, memberSerialization); 
     var propertyType = property.PropertyType.GetUnderlyingType(); 

     if (IgnoredTypes.Contains(propertyType)) 
     { 
      property.ShouldSerialize = instance => false; 
     } 
     else 
     { 
      property.ShouldSerialize = instance => true; 
     } 
     return property; 
    } 
} 

Können Sie mir helfen, den realen Wert Art und ignorieren es zu bekommen?

Antwort

2

property.PropertyType wird den deklarierten (Kompilierzeit) Typ der Eigenschaft zurückgeben, der immer object hier ist. Wenn Sie die Entscheidung auf den tatsächlichen Laufzeittyp des Eigenschaftswerts serialisieren möchten, müssen Sie den Wert instance mithilfe von Reflektion abrufen und dann dessen Typ überprüfen.
Versuchen Sie es wie folgt statt:

protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
{ 
    var property = base.CreateProperty(member, memberSerialization); 

    if (property.PropertyType == typeof(object)) 
    { 
     property.ShouldSerialize = instance => 
     { 
      PropertyInfo pi = member as PropertyInfo; 
      object propertyValue = (pi != null) ? pi.GetValue(instance) : null; 
      return propertyValue != null && !IgnoredTypes.Contains(propertyValue.GetType()); 
     }; 
    } 
    else if (IgnoredTypes.Contains(property.PropertyType)) 
    { 
     property.ShouldSerialize = instance => false; 
    } 

    return property; 
} 

Fiddle: https://dotnetfiddle.net/2A2KMH

+0

Ja, es funktioniert. Vielen Dank! – NSK

Verwandte Themen