|
|
@@ -82,9 +82,10 @@ namespace System.Runtime.Serialization.Json
|
|
|
{
|
|
|
var l = new List<TypeMapMember> ();
|
|
|
foreach (var fi in type.GetFields ())
|
|
|
- l.Add (new TypeMapField (fi, null));
|
|
|
+ if (!fi.IsStatic)
|
|
|
+ l.Add (new TypeMapField (fi, null));
|
|
|
foreach (var pi in type.GetProperties ())
|
|
|
- if (pi.CanRead && pi.CanWrite)
|
|
|
+ if (pi.CanRead && pi.CanWrite && !pi.GetGetMethod ().IsStatic)
|
|
|
l.Add (new TypeMapProperty (pi, null));
|
|
|
l.Sort ((x, y) => x.Order != y.Order ? x.Order - y.Order : String.Compare (x.Name, y.Name, StringComparison.Ordinal));
|
|
|
return new TypeMap (type, null, l.ToArray ());
|
|
|
@@ -148,13 +149,26 @@ namespace System.Runtime.Serialization.Json
|
|
|
string element;
|
|
|
TypeMapMember [] members;
|
|
|
|
|
|
+ static readonly Type [] deser_methods_args = new Type [] { typeof (StreamingContext) };
|
|
|
+ const BindingFlags binding_flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
|
|
|
+
|
|
|
public TypeMap (Type type, string element, TypeMapMember [] orderedMembers)
|
|
|
{
|
|
|
this.type = type;
|
|
|
this.element = element;
|
|
|
this.members = orderedMembers;
|
|
|
+
|
|
|
+ foreach (var mi in type.GetMethods (binding_flags)) {
|
|
|
+ if (mi.GetCustomAttributes (typeof (OnDeserializingAttribute), false).Length > 0)
|
|
|
+ OnDeserializing = mi;
|
|
|
+ else if (mi.GetCustomAttributes (typeof (OnDeserializedAttribute), false).Length > 0)
|
|
|
+ OnDeserialized = mi;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ public MethodInfo OnDeserializing { get; set; }
|
|
|
+ public MethodInfo OnDeserialized { get; set; }
|
|
|
+
|
|
|
public void Serialize (JsonSerializationWriter outputter, object graph)
|
|
|
{
|
|
|
foreach (TypeMapMember member in members) {
|
|
|
@@ -172,6 +186,8 @@ namespace System.Runtime.Serialization.Json
|
|
|
bool isNull = reader.GetAttribute ("type") == "null";
|
|
|
|
|
|
object ret = isNull ? null : FormatterServices.GetUninitializedObject (type);
|
|
|
+ if (ret != null && OnDeserializing != null)
|
|
|
+ OnDeserializing.Invoke (ret, new object [] {new StreamingContext (StreamingContextStates.All)});
|
|
|
Dictionary<TypeMapMember,bool> filled = new Dictionary<TypeMapMember,bool> ();
|
|
|
|
|
|
reader.ReadStartElement ();
|
|
|
@@ -192,6 +208,8 @@ namespace System.Runtime.Serialization.Json
|
|
|
reader.Skip ();
|
|
|
}
|
|
|
reader.ReadEndElement ();
|
|
|
+ if (ret != null && OnDeserialized != null)
|
|
|
+ OnDeserialized.Invoke (ret, new object [] {new StreamingContext (StreamingContextStates.All)});
|
|
|
return ret;
|
|
|
}
|
|
|
}
|