[gxml] SerializableArrayList now support post-deserialization



commit 110b452fbf04595974111e9635e12316a8f36e5d
Author: Daniel Espinosa <esodan gmail com>
Date:   Wed Feb 24 11:56:43 2016 -0600

    SerializableArrayList now support post-deserialization
    
    * Calling deserialize() over SerializableArrayList can be
      controlled by SerializableCollection.deserialize_proceed()
      for post deserialization using
      SerializableCollection.deserialize_children()
    
    * SerializableCollection.deserialize_children() now uses
      internal GXml.Node to deserialize from
    
    * Tests shows a improvement on document loading but a penalty
      on post deserialization of about 20% above in total time
      (loading+post-deserialization) Vs. (load+deserialization)

 NEWS                                   |    9 +++++++++
 gxml/SerializableContainer.vala        |    2 +-
 gxml/SerializableGeeArrayList.vala     |   16 +++++++++-------
 gxml/SerializableGeeDualKeyMap.vala    |    6 +++---
 gxml/SerializableGeeHashMap.vala       |    4 ++--
 gxml/SerializableGeeTreeMap.vala       |    6 +++---
 test/SerializableGeeArrayListTest.vala |   19 +++++++++++++++----
 7 files changed, 42 insertions(+), 20 deletions(-)
---
diff --git a/NEWS b/NEWS
index 69c68d1..d7771c7 100644
--- a/NEWS
+++ b/NEWS
@@ -3,8 +3,17 @@ Version 0.9.2
 ===============
 
 * API change Serializable.deserialize now return a boolean
+
 * API change SerializableCollection: added new abstract methods
 
+* SerializableCollection: SerializableArrayList now support enable/disable deserialization
+  for post operation using SerializableCollection.deserialize_children() initial document
+  load time optimization
+
+* More memory optimizations: SerializableCollection implementations don't hold
+  objects for unknown properties and nodes
+
+
 
 ===============
 Version 0.9.1
diff --git a/gxml/SerializableContainer.vala b/gxml/SerializableContainer.vala
index 08460b8..362f5fd 100644
--- a/gxml/SerializableContainer.vala
+++ b/gxml/SerializableContainer.vala
@@ -77,7 +77,7 @@ public interface GXml.SerializableCollection : Object, Gee.Traversable<Serializa
    *
    * This could override existing objects in collection.
    */
-  public abstract bool deserialize_children (GXml.Node node);
+  public abstract bool deserialize_children ();
   /**
    * Convenient function to detect Serializable Collections.
    */
diff --git a/gxml/SerializableGeeArrayList.vala b/gxml/SerializableGeeArrayList.vala
index b9d3079..a1ae8b0 100644
--- a/gxml/SerializableGeeArrayList.vala
+++ b/gxml/SerializableGeeArrayList.vala
@@ -30,13 +30,12 @@ using Gee;
  */
 public class GXml.SerializableArrayList<G> : Gee.ArrayList<G>, Serializable, SerializableCollection
 {
-  Gee.HashMap<string,GXml.Attribute> _unknown_serializable_property = new Gee.HashMap<string,GXml.Attribute> 
();
-  Gee.ArrayList<GXml.Node> _unknown_serializable_nodes = new Gee.ArrayList<GXml.Node> ();
   GXml.Node _node;
+  bool _deserialized = false;
 
   // SerializableCollection interface
   public virtual bool deserialize_proceed () { return true; }
-  public virtual bool deserialized () { return true; }
+  public virtual bool deserialized () { return _deserialized; }
   public virtual bool is_prepared () { return (_node is GXml.Node); }
   public virtual bool deserialize_node (GXml.Node node) {
     if (!element_type.is_a (typeof (GXml.Serializable))) {
@@ -52,19 +51,21 @@ public class GXml.SerializableArrayList<G> : Gee.ArrayList<G>, Serializable, Ser
     }
     return true;
   }
-  public virtual bool deserialize_children (GXml.Node node) {
+  public virtual bool deserialize_children () {
+    if (!is_prepared ()) return false;
     if (!element_type.is_a (typeof (GXml.Serializable))) {
       throw new SerializableError.UNSUPPORTED_TYPE_ERROR (_("%s: Value type '%s' is unsupported"), 
                                                     this.get_type ().name (), element_type.name ());
     }
-    if (node is Element) {
+    if (_node is Element) {
 #if DEBUG
             GLib.message (@"Deserializing ArrayList on Element: $(node.name)");
 #endif
-      foreach (GXml.Node n in node.childs) {
+      foreach (GXml.Node n in _node.children) {
         deserialize_property (n);
       }
     }
+    _deserialized = true;
     return true;
   }
 
@@ -145,8 +146,9 @@ public class GXml.SerializableArrayList<G> : Gee.ArrayList<G>, Serializable, Ser
   public bool default_deserialize (GXml.Node node)
                     throws GLib.Error
   {
+    _node = node;
     if (deserialize_proceed ())
-      return deserialize_children (node);
+      return deserialize_children ();
     return false;
   }
   public virtual bool deserialize_property (GXml.Node property_node)
diff --git a/gxml/SerializableGeeDualKeyMap.vala b/gxml/SerializableGeeDualKeyMap.vala
index 3d6c6ca..91e0706 100644
--- a/gxml/SerializableGeeDualKeyMap.vala
+++ b/gxml/SerializableGeeDualKeyMap.vala
@@ -37,8 +37,8 @@ public class GXml.SerializableDualKeyMap<P,S,V> : Object, Gee.Traversable <V>, S
   public virtual bool deserialize_proceed () { return true; }
   public virtual bool deserialized () { return true; }
   public virtual bool is_prepared () { return (_node is GXml.Node); }
-  public virtual bool deserialize_node (GXml.Node node) { return deserialize_property (node); }
-  public virtual bool deserialize_children (GXml.Node node) { return deserialize (node); }
+  public virtual bool deserialize_node (GXml.Node node) { return false; }
+  public virtual bool deserialize_children () { return false; }
 
        construct { Init.init (); }
 
@@ -205,7 +205,7 @@ public class GXml.SerializableDualKeyMap<P,S,V> : Object, Gee.Traversable <V>, S
       throw new SerializableError.UNSUPPORTED_TYPE_ERROR (_("%s: Value type '%s' is unsupported"), 
                                                     this.get_type ().name (), value_type.name ());
     }
-    foreach (GXml.Node n in node.childs) {
+    foreach (GXml.Node n in node.children) {
       if (n is Element) {
         var obj = (SerializableMapDualKey<P,S>) Object.new (value_type);
 #if DEBUG
diff --git a/gxml/SerializableGeeHashMap.vala b/gxml/SerializableGeeHashMap.vala
index f0cd113..8eaf69b 100644
--- a/gxml/SerializableGeeHashMap.vala
+++ b/gxml/SerializableGeeHashMap.vala
@@ -34,8 +34,8 @@ public class GXml.SerializableHashMap<K,V> : Gee.HashMap<K,V>, Serializable, Ser
   public virtual bool deserialize_proceed () { return true; }
   public virtual bool deserialized () { return true; }
   public virtual bool is_prepared () { return (_node is GXml.Node); }
-  public virtual bool deserialize_node (GXml.Node node) { return deserialize_property (node); }
-  public virtual bool deserialize_children (GXml.Node node) { return deserialize (node); }
+  public virtual bool deserialize_node (GXml.Node node) { return false; }
+  public virtual bool deserialize_children () { return false; }
 
        // Construct
        construct { Init.init (); }
diff --git a/gxml/SerializableGeeTreeMap.vala b/gxml/SerializableGeeTreeMap.vala
index 30a3065..020e8d3 100644
--- a/gxml/SerializableGeeTreeMap.vala
+++ b/gxml/SerializableGeeTreeMap.vala
@@ -34,8 +34,8 @@ public class GXml.SerializableTreeMap<K,V> : Gee.TreeMap<K,V>, Serializable, Ser
   public virtual bool deserialize_proceed () { return true; }
   public virtual bool deserialized () { return true; }
   public virtual bool is_prepared () { return (_node is GXml.Node); }
-  public virtual bool deserialize_node (GXml.Node node) { return deserialize_property (node); }
-  public virtual bool deserialize_children (GXml.Node node) { return deserialize (node); }
+  public virtual bool deserialize_node (GXml.Node node) { return false; }
+  public virtual bool deserialize_children () { return false; }
 
        construct { Init.init (); }
 
@@ -122,7 +122,7 @@ public class GXml.SerializableTreeMap<K,V> : Gee.TreeMap<K,V>, Serializable, Ser
                                                     this.get_type ().name (), value_type.name ());
     }
     if (node is Element) {
-      foreach (GXml.Node n in node.childs) {
+      foreach (GXml.Node n in node.children) {
         if (n is Element) {
 #if DEBUG
           stdout.printf (@"Node $(node.name) for type '$(get_type ().name ())'\n");
diff --git a/test/SerializableGeeArrayListTest.vala b/test/SerializableGeeArrayListTest.vala
index 36bf0b8..3a83c55 100644
--- a/test/SerializableGeeArrayListTest.vala
+++ b/test/SerializableGeeArrayListTest.vala
@@ -217,27 +217,38 @@ class SerializableGeeArrayListTest : GXmlTest
     () => {
       try {
         double time;
+        Test.message ("Starting generating document...");
         Test.timer_start ();
         var d = new TwDocument ();
         var ce = new CElement ();
-        for (int i = 0; i < 10000; i++) {
+        for (int i = 0; i < 100000; i++) {
           var e = new AElement ();
           ce.elements.add (e);
         }
+        ce.serialize (d);
         time = Test.timer_elapsed ();
         Test.minimized_result (time, "Created document: %g seconds", time);
-        ce.serialize (d);
+        Test.message ("Starting deserializing document: Disable collection deserialization...");
         Test.timer_start ();
         var cep = new CElement ();
         cep.elements.enable_serialize = false;
         cep.deserialize (d);
         time = Test.timer_elapsed ();
-        Test.minimized_result (time, "Enable Deserialize Collection. Deserialized from doc: %g seconds", 
time);
+        Test.minimized_result (time, "Disable Deserialize Collection. Deserialized from doc: %g seconds", 
time);
+        assert (cep.elements.is_prepared ());
+        Test.message ("Calling deserialize_children()...");
+        Test.timer_start ();
+        cep.elements.deserialize_children ();
+        time = Test.timer_elapsed ();
+        Test.minimized_result (time, "Disable Deserialize Collection. Deserialized from NODE: %g seconds", 
time);
+        Test.message ("Starting deserializing document: Enable collection deserialization...");
+        Test.timer_start ();
         var cet = new CElement ();
         cet.elements.enable_serialize = true;
         cet.deserialize (d);
         time = Test.timer_elapsed ();
-        Test.minimized_result (time, "Disable Deserialize Collection. Deserialized from doc: %g seconds", 
time);
+        Test.minimized_result (time, "Enable Deserialize Collection. Deserialized from doc: %g seconds", 
time);
+        assert (d.root.children.size == 100000);
       } catch (GLib.Error e) {
         GLib.message ("ERROR: "+e.message);
         assert_not_reached ();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]