2010-07-06 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Tue, 6 Jul 2010 13:41:08 +0000 (13:41 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Tue, 6 Jul 2010 13:41:08 +0000 (13:41 -0000)
* TypeMap.cs :
  Do not try to add static members as serialization targets.
  Support OnDeserializing and OnDeserialized. Fixed bug #615800.

* DataContractJsonSerializerTest.cs : add test for bug #615800.

svn path=/trunk/mcs/; revision=159958

mcs/class/System.ServiceModel.Web/System.Runtime.Serialization.Json/ChangeLog
mcs/class/System.ServiceModel.Web/System.Runtime.Serialization.Json/TypeMap.cs
mcs/class/System.ServiceModel.Web/Test/System.Runtime.Serialization.Json/ChangeLog
mcs/class/System.ServiceModel.Web/Test/System.Runtime.Serialization.Json/DataContractJsonSerializerTest.cs

index 693411194a61c0ae965ed3f99491615637f32b92..0be85b138855f40472b2b3f23e0bebd8abb33343 100644 (file)
@@ -1,3 +1,9 @@
+2010-07-06  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * TypeMap.cs :
+         Do not try to add static members as serialization targets.
+         Support OnDeserializing and OnDeserialized. Fixed bug #615800.
+
 2010-07-06  Atsushi Enomoto  <atsushi@ximian.com>
 
        * JsonSerializationWriter.cs : it cannot serialize DateTime in
index 0b0f7849668b1be4f884d697f847c6724ef65840..806c9aba85f7e6c755e01ac835014f39dcc4eff3 100644 (file)
@@ -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;
                }
        }
index 11d9650a1f8204cda689588bba82be6fa27f0efe..532e1232d3a4ad4d3a82b2df8924c2e3aa1d7044 100644 (file)
@@ -1,3 +1,7 @@
+2010-07-06  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * DataContractJsonSerializerTest.cs : add test for bug #615800.
+
 2010-07-06  Atsushi Enomoto  <atsushi@ximian.com>
 
        * DataContractJsonSerializerTest.cs : add test for bug #615801.
index 2afdd1c71f812fb36bc3740c1c6e887d9bb5ad03..7076c6f8bb4dfae0951fa4b98354e71bb013d36d 100644 (file)
@@ -1373,6 +1373,20 @@ namespace MonoTests.System.Runtime.Serialization.Json
                        a = (ClassA) ds.ReadObject (stream);
                        Assert.IsNull (a.B, "#1");
                }
+
+               [Test]
+               public void OnDeserializationMethods ()
+               {
+                       var ds = new DataContractJsonSerializer (typeof (GSPlayerListErg));
+                       var obj = new GSPlayerListErg ();
+                       var ms = new MemoryStream ();
+                       ds.WriteObject (ms, obj);
+                       ms.Position = 0;
+                       ds.ReadObject (ms);
+                       Assert.IsTrue (GSPlayerListErg.A, "A");
+                       Assert.IsTrue (GSPlayerListErg.B, "B");
+                       Assert.IsTrue (GSPlayerListErg.C, "C");
+               }
        }
 
        public class TestData
@@ -1553,6 +1567,38 @@ namespace MonoTests.System.Runtime.Serialization.Json
        public class ClassB
        {
        }
+
+       public class GSPlayerListErg
+       {
+               public GSPlayerListErg ()
+               {
+                       Init ();
+               }
+
+               void Init ()
+               {
+                       C = true;
+               }
+
+               [OnDeserializing]
+               public void OnDeserializing (StreamingContext c)
+               {
+                       A = true;
+                       Init ();
+               }
+
+               [OnDeserialized]
+               void OnDeserialized (StreamingContext c)
+               {
+                       B = true;
+               }
+
+               public static bool A, B, C;
+
+               [DataMember (Name = "T")]
+               public long CodedServerTimeUTC { get; set; }
+               public DateTime ServerTimeUTC { get; set; }
+       }
 }
 
 [DataContract]