[gxml] SerializableArrayList now support post-deserialization
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gxml] SerializableArrayList now support post-deserialization
- Date: Wed, 24 Feb 2016 19:48:32 +0000 (UTC)
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]