After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 157734 - GObject Serialization Proposal
GObject Serialization Proposal
Status: RESOLVED WONTFIX
Product: glib
Classification: Platform
Component: gobject
unspecified
Other All
: Normal enhancement
: ---
Assigned To: gtkdev
gtkdev
Depends on:
Blocks:
 
 
Reported: 2004-11-09 11:05 UTC by Zeeshan Ali
Modified: 2011-02-18 16:13 UTC
See Also:
GNOME target: ---
GNOME version: ---



Description Zeeshan Ali 2004-11-09 11:05:09 UTC
I was told that it would be a good idea to put my proposal here so it does'nt
get ignored/forgoten. So I am simply pasting what i sent to the ML here:

   In this email, I intend to propose a model for GObject
Serialization. Before the actual proposal itself, I would describe the
whole story which lead me to this conclusion. The impatient should
simply move to the Conclusion below.

BACKGROUND:
  Some months back I was writing an application for an embedded (not
in the true sense though) system and I needed object persistence in
that. I quickly realized that for implementing object persistence, I
need to implement object serialization first. So I started to write
code to do that. Here is the summary of what I did:

1. Wrote a DTD, which was nothing but a small hack on glade-2.0.dtd
2. Wrote two functions:
    gchar * g_object_to_xml (GObject *object);
    GObject * g_object_from_xml (gchar *xml);

    These functions were dependent on the what object used to show to
you through readable props. This code worked quite well for my simple
objects but as I wrote the two functions, I realized that there are a
lot of problems with this non-introspective method,  e.g

1. Not all important props are readable.
2. Even if the a prop. is readable it may be of a type which the
serialization code may not know howto handle, e.g gpointers.

 So what i conclude is that, the object should itself have
serialization capabilities. Now I thought out two ways to achieve
this:

1. To add serialization/deserialization methods into GObject class
itself, which would implement the non-introspective way. All the other
objects can then over-ride those methods to implement a better
Serialization. The problem with this way is that you are forcing
Serialization on everyone without providing a good default
implementation for it.

2. To do it the Java way: have an interface named 'GSerializable' or
'GSerializableObject' in the gobject core, which can be implemented by
anyone who wants his object to support Serialization.

 The 2nd option seems to be the best to me, so lets suppose we chose
to go this way. Now the question is how should the GSerializable
interface look like. Let's say it contains the following methods:

gchar * g_serializable_to_xml (GSerializable *serializable);
GSerializable * g_serializable_from_xml (GSerializableClass
*serializable_class, gchar *xml);

 The above methods look very nice and innocent at the first sight.
But as you look closely, it is XML specific. Despite the fact that XML
is QUITE a generic format but it's still not generic enough.

 Many people may be simply jumping to the conclusion below and I had
to address all, so dont be surprised for being treated as a perfect
stranger. :)

Conclusion:
 My conclusion, rather a proposal to the gobject developer's team is
to add an interface into the gobject core library, named
'GSerializable' (or anything they like) which would have the following
two methods (at least):

gchar * g_serializable_save_thyself (GSerializable *serializable, gchar *mime);

  This method would be responsible to serialize a given instance into
the format requested by the calling function through the mime
argument. The method should serialize the object on an allocated
buffer and return it. In case of failure, e.g if the object doesn't
support serialization into the mime type requested it should return a
NULL.

GSerializable * g_serializable_restore_thyself (GSerializableClass
*serializable_class, gchar *buffer, gchar *mime);

  This method would be responsible to construct an instance from the
data given through the buffer argument. The data which must be in the
format specified through the mime argument. The method should
serialize the object on an allocated buffer and return it. In case of
failure, like if the object doesn't support deserialization from the
mime type requested it should return a NULL.

GSList * g_serializable_supported_formats (GSerializableClass *serializable);

 This method would simply be responsible to return a list of
supported mime types.

 This of course is just a rough idea. Criticism and Corrections both
are welcome. :)
Comment 1 Zeeshan Ali 2004-11-09 11:12:45 UTC
Upon questions/criticism by jody@gnome.org, I thought (and he agreed) that the
following calls:

gchar * g_serializable_save_thyself (GSerializable *serializable, gchar *mime);
GSerializable * g_serializable_restore_thyself (GSerializableClass
*serializable_class, gchar *buffer, gchar *mime);

should be changed to:

gpointer g_serializable_save_thyself (GSerializable *serializable, gchar *mime);
GSerializable * g_serializable_restore_thyself (GSerializableClass
*serializable_class, gpointer buffer, gchar *mime);
Comment 2 Stefan Sauer (gstreamer, gtkdoc dev) 2005-01-03 13:28:10 UTC
A short comment about requirements for the GSerializable Interface:
1.) Need to mark a property as volatile or not. Only non-volatile properties are
saved. Java does it this way.

2.) I am not so concerned about read-only properties. I found no example of a
read-only property that would need to be serialized. Any example?

3.) A major problem is that things like GList art *not* GObjects. As already has
been pointed out, if a property returns a gpointer to a e.,g. GList, the
framework can't find out about that. So we need metadata about that in the
interface.
Comment 3 Stefan Sauer (gstreamer, gtkdoc dev) 2006-01-03 14:57:37 UTC
I've started a proposal on our wiki:
http://www.buzztard.org/index.php/Gobject_serialisation
Comment 4 Behdad Esfahbod 2006-04-18 16:13:41 UTC
Another issue is what to do when objects reference eachother. A useful persistence model should attach a unique id to each object and when serializing, and use that to connect back to the other object when deserializing.  It only makes sense when serialize/deserialize all reachable objects though.
Comment 5 Tim Janik 2006-05-24 10:40:58 UTC
*** Bug 342358 has been marked as a duplicate of this bug. ***
Comment 6 Tim Janik 2006-05-24 11:12:20 UTC
i'm closing this bug, because i don't think generic serialization
is feasible in libgobject. rationale provided here:
  http://mail.gnome.org/archives/gtk-devel-list/2006-May/msg00258.html
Comment 7 Tim Janik 2006-06-02 14:33:16 UTC
and rationale continued here: http://mail.gnome.org/archives/gtk-devel-list/2006-May/msg00258.html
Comment 8 Tim Janik 2006-06-02 14:35:50 UTC
(In reply to comment #7)
> and rationale continued here:
> http://mail.gnome.org/archives/gtk-devel-list/2006-May/msg00258.html
 
sorry, i mean to post this link as continuation:
  http://mail.gnome.org/archives/gtk-devel-list/2006-June/msg00020.html