Language Independent Object Serialization
Problem
How do we serialize Objects so we can later read them back into a
program of either the same language or a different language? Also, how
do we allow humans to easily create, read, and modify these objects
(i.e. include human languages)?
It is common to need a simple way to save a web of objects and later
read them back in to the same program or a different one. Sometimes the
programs will be of the same language (e.g. both Java) and sometimes
they will be different. The later is much more complicated, especially
in its most general form (any object to any language). A variation on
the inter-language movement is from human writable language (through
text) to a computer language. Usually this is restricted to very simple
information (e.g. String properties) or document-oriented information
(e.g. HTML/SGML).
Forces
If we do not have a single interchange format we will have multiple ones
and the complexity will be higher. If we can not describe objects in a
cross-language format than languages will be unable to interoperate with
this mechanism. If we can not describe object information in
human-readable formats than humans will be less likely to understand the
process and will be unable to participate in the general capabilities
(e.g. they can only work with simple property files).
A single, general, object interchange approach would allow all movements
of objects to be easier to both computers and people. On the other
hand, if we try to design a general approach that becomes too cumbersome
it will not be useful to the many common needs of applications (i.e.
same language serialization and simple property files).
MONDO Approach
Encode information as "recipes" to build objects. Describe the most
general information first: what to build and what "ingredients" (recipes
for other objects) it needs. Next describe the language independent
model of that information. Finally describe the possible
implementations for that model in different languages. Any of these
steps (other than the first) can be left off but it results in less
ability to move between languages.
Also, enable "recipes" to be easily convertible to a human readable and
writeable form: usually as marked-up text files in any one of
XML/SGML/OML (the last being oriented to objects and MONDO, an Object
Markup Language similar to XML).
Some simple examples of recipes (in OML and no models yet) are:
=====================
<Period
start = <Date iso="1997-10-01">
end = <Date>
>
----------------------
<Map pairs = (
<Pair key='speed0' value = ('speed0.gif' '(Speed0)' 4 11)>
<Pair key='speed1' value = ('speed1.gif' '(Speed1)' 4 11)>
<Pair key='remote' value = ('remote.gif' '(Link to Remote Location)' 11 11)>
<Pair key='local' value = ('local.gif' '(Link to Local Page)' 6 6)>
)>
----------------------
<JavaClass
name = "COM.chimu.kernel.basicTypes.Period"
version = "v0.1"
vmRequired = "1.1"
description = "This is a simple Period which uses
java.util.Dates as its start and end values"
bytecodes = <Binary encoding=hex [[cafebabe...2000a]]>
>
----------------------
<mode name = "section-reference"
bindings = (
<When element = "note"
build = <!Recipe (
<Paragraph
font-size = "12pt"
content = <Sequence
font-weight = "bold"
content = "Warning:">
>
<process-children>
) !Recipe>
>
<When element = "title"
build = <!Recipe <process-children>>
>
//...
>
----------------------
<P {VTL's company philosophy and strategic direction
are set by <A href="lmanley.html" {Luke Manley}>,
the company's President. The following is a summary
written by Luke on what he views as the key elements
to VTL's success. } P>
=======================
All of the above, when by themselves, rely on the reading and "building"
application to interpret and implement the information model. This
might be suitable for language specific encoding of information or when
the model is very standard.
But we can also explicitly add model information, for example:
<!-- ExampleModel.oml -->
<Model types=(
//...
<Type
name = "Period"
description = "A range of dates"
properties = (
<Property name="start" type=<TypeReference name="Date">>
<Property name="end" type=<TypeReference name="Date">>
)
constructors = (
<Constructor ("start" "end")>
)
>
//...
)>
And loosely[1] link it to the actual information:
<UseModel fileName="exampleModel.oml">
<Period
start = <Date iso="1997-10-01">
end = <Date>
>
Alternatively we can use well-known models, which allow wider
interchange without moving recipes:
<UseModel
model=<FindReference
<DTDReference sysid="-//HaL and O'Reilly//DTD DocBook//EN">
>
>
<UseModel
model=<FindReference
<Reference id="com.sun.java.jdk1_1.standardClasses">
>
>
The next step is to be able to connect specific implementations to the
models, but this is covered in a different MONDO approach statement:
"Extending Model Functionality"
Benefits
We have a very general way to encode information so multiple
applications, programming environments, and people can understand it.
It is simple to parse and process for a computer and for a person. We
have also cleanly separated the information from the specifics required
to instantiate that information in any given programming environment.
But we can encode general models for the information in the same format
(complete reflectivity and closure) and take advantage of them if the
application desires.
We can take advantage of sharing models and information through public
references to objects/recipes or by "shipping" recipes along with the
information. This supports both a push and a pull model of moving
information, models, and implementation between applications.
Inter-language movement is inherently supported, as well as
inter-version (e.g. JDK version) movement. The choice is up to the
application how well the information is described vs. how much the
receiving application will be responsible for interpretation.
General document markup, objects, and information modeling are aligned
and we can take advantage of the concepts, patterns, designs, and
abilities of all of them.
Penalties
MONDO is a newer approach that is different from industry specific and
language-specific approaches. More overhead than language specific
binary approaches [this could be lessened or removed by using binary
recipe encoding format]. Possibly slightly more overhead than simple
text property files, but is much more general.
See
The MONDO Design document, an especially Chapters 1-5.
http://www.chimu.com/projects/mondo/design/index.html
For related technology see the Smalltalk file-in format, LISP, Java
serialization, CORBA and the ODMG OIF specification. Some resources for
these can be found at:
http://www.chimu.com/projects/mondo/links.html
|