40 lines
No EOL
18 KiB
HTML
40 lines
No EOL
18 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"/><meta name="viewport" content="width=device-width, initial-scale=0.8"/><title>6.9 Object Serialization</title><link rel="stylesheet" type="text/css" href="../scribble.css" title="default"/><link rel="stylesheet" type="text/css" href="extras.css" title="default"/><link rel="stylesheet" type="text/css" href="../racket.css" title="default"/><link rel="stylesheet" type="text/css" href="../manual-style.css" title="default"/><link rel="stylesheet" type="text/css" href="../manual-racket.css" title="default"/><link rel="stylesheet" type="text/css" href="../manual-racket.css" title="default"/><link rel="stylesheet" type="text/css" href="../doc-site.css" title="default"/><script type="text/javascript" src="../scribble-common.js"></script><script type="text/javascript" src="../manual-racket.js"></script><script type="text/javascript" src="../manual-racket.js"></script><script type="text/javascript" src="../doc-site.js"></script><script type="text/javascript" src="../local-redirect/local-redirect.js"></script><script type="text/javascript" src="../local-redirect/local-user-redirect.js"></script><!--[if IE 6]><style type="text/css">.SIEHidden { overflow: hidden; }</style><![endif]--></head><body id="doc-racket-lang-org"><div class="tocset"><div class="tocview"><div class="tocviewlist tocviewlisttopspace"><div class="tocviewtitle"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,"tocview_0");">►</a></td><td></td><td><a href="index.html" class="tocviewlink" data-pltdoc="x">The Racket Reference</a></td></tr></table></div><div class="tocviewsublisttop" style="display: none;" id="tocview_0"><table cellspacing="0" cellpadding="0"><tr><td align="right">1 </td><td><a href="model.html" class="tocviewlink" data-pltdoc="x">Language Model</a></td></tr><tr><td align="right">2 </td><td><a href="notation.html" class="tocviewlink" data-pltdoc="x">Notation for Documentation</a></td></tr><tr><td align="right">3 </td><td><a href="syntax.html" class="tocviewlink" data-pltdoc="x">Syntactic Forms</a></td></tr><tr><td align="right">4 </td><td><a href="data.html" class="tocviewlink" data-pltdoc="x">Datatypes</a></td></tr><tr><td align="right">5 </td><td><a href="structures.html" class="tocviewlink" data-pltdoc="x">Structures</a></td></tr><tr><td align="right">6 </td><td><a href="mzlib_class.html" class="tocviewselflink" data-pltdoc="x">Classes and Objects</a></td></tr><tr><td align="right">7 </td><td><a href="mzlib_unit.html" class="tocviewlink" data-pltdoc="x">Units</a></td></tr><tr><td align="right">8 </td><td><a href="contracts.html" class="tocviewlink" data-pltdoc="x">Contracts</a></td></tr><tr><td align="right">9 </td><td><a href="match.html" class="tocviewlink" data-pltdoc="x">Pattern Matching</a></td></tr><tr><td align="right">10 </td><td><a href="control.html" class="tocviewlink" data-pltdoc="x">Control Flow</a></td></tr><tr><td align="right">11 </td><td><a href="concurrency.html" class="tocviewlink" data-pltdoc="x">Concurrency and Parallelism</a></td></tr><tr><td align="right">12 </td><td><a href="Macros.html" class="tocviewlink" data-pltdoc="x">Macros</a></td></tr><tr><td align="right">13 </td><td><a href="input-and-output.html" class="tocviewlink" data-pltdoc="x">Input and Output</a></td></tr><tr><td align="right">14 </td><td><a href="security.html" class="tocviewlink" data-pltdoc="x">Reflection and Security</a></td></tr><tr><td align="right">15 </td><td><a href="os.html" class="tocviewlink" data-pltdoc="x">Operating System</a></td></tr><tr><td align="right">16 </td><td><a href="memory.html" class="tocviewlink" data-pltdoc="x">Memory Management</a></td></tr><tr><td align="right">17 </td><td><a href="unsafe.html" class="tocviewlink" data-pltdoc="x">Unsafe Operations</a></td></tr><tr><td align="right">18 </td><td><a href="running.html" class="tocviewlink" data-pltdoc="x">Running Racket</a></td></tr><tr><td align="right"></td><td><a href="doc-bibliography.html" class="tocviewlink" data-pltdoc="x">Bibliography</a></td></tr><tr><td align="right"></td><td><a href="doc-index.html" class="tocviewlink" data-pltdoc="x">Index</a></td></tr></table></div></div><div class="tocviewlist"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,"tocview_1");">▼</a></td><td>6 </td><td><a href="mzlib_class.html" class="tocviewlink" data-pltdoc="x">Classes and Objects</a></td></tr></table><div class="tocviewsublistbottom" style="display: block;" id="tocview_1"><table cellspacing="0" cellpadding="0"><tr><td align="right">6.1 </td><td><a href="createinterface.html" class="tocviewlink" data-pltdoc="x">Creating Interfaces</a></td></tr><tr><td align="right">6.2 </td><td><a href="createclass.html" class="tocviewlink" data-pltdoc="x">Creating Classes</a></td></tr><tr><td align="right">6.3 </td><td><a href="objcreation.html" class="tocviewlink" data-pltdoc="x">Creating Objects</a></td></tr><tr><td align="right">6.4 </td><td><a href="ivaraccess.html" class="tocviewlink" data-pltdoc="x">Field and Method Access</a></td></tr><tr><td align="right">6.5 </td><td><a href="mixins.html" class="tocviewlink" data-pltdoc="x">Mixins</a></td></tr><tr><td align="right">6.6 </td><td><a href="trait.html" class="tocviewlink" data-pltdoc="x">Traits</a></td></tr><tr><td align="right">6.7 </td><td><a href="Object_and_Class_Contracts.html" class="tocviewlink" data-pltdoc="x">Object and Class Contracts</a></td></tr><tr><td align="right">6.8 </td><td><a href="objectequality.html" class="tocviewlink" data-pltdoc="x">Object Equality and Hashing</a></td></tr><tr><td align="right">6.9 </td><td><a href="objectserialize.html" class="tocviewselflink" data-pltdoc="x">Object Serialization</a></td></tr><tr><td align="right">6.10 </td><td><a href="objectprinting.html" class="tocviewlink" data-pltdoc="x">Object Printing</a></td></tr><tr><td align="right">6.11 </td><td><a href="objectutils.html" class="tocviewlink" data-pltdoc="x">Object, Class, and Interface Utilities</a></td></tr><tr><td align="right">6.12 </td><td><a href="Surrogates.html" class="tocviewlink" data-pltdoc="x">Surrogates</a></td></tr></table></div></div></div><div class="tocsub"><div class="tocsubtitle">On this page:</div><table class="tocsublist" cellspacing="0"><tr><td><a href="objectserialize.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-serializable-class%2A%29%29" class="tocsublink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">define-<wbr></wbr>serializable-<wbr></wbr>class*</span></span></a></td></tr><tr><td><a href="objectserialize.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-serializable-class%29%29" class="tocsublink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">define-<wbr></wbr>serializable-<wbr></wbr>class</span></span></a></td></tr><tr><td><a href="objectserialize.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._externalizable~3c~25~3e%29%29" class="tocsublink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">externalizable<%></span></span></a></td></tr></table></div></div><div class="maincolumn"><div class="main"><div class="navsettop"><span class="navleft"><form class="searchform"><input class="searchbox" id="searchbox" type="text" tabindex="1" placeholder="...search manuals..." title="Enter a search string to search the manuals" onkeypress="return DoSearchKey(event, this, "8.6", "../");"/></form> <a href="https://docs.racket-lang.org/index.html" title="up to the documentation top" data-pltdoc="x" onclick="return GotoPLTRoot("8.6");">top</a><span class="tocsettoggle"> <a href="javascript:void(0);" title="show/hide table of contents" onclick="TocsetToggle();">contents</a></span></span><span class="navright"> <a href="objectequality.html" title="backward to "6.8 Object Equality and Hashing"" data-pltdoc="x">← prev</a> <a href="mzlib_class.html" title="up to "6 Classes and Objects"" data-pltdoc="x">up</a> <a href="objectprinting.html" title="forward to "6.10 Object Printing"" data-pltdoc="x">next →</a></span> </div><h4 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""objectserialize"">6.9<tt> </tt><a name="(part._objectserialize)"></a>Object Serialization</h4><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><table cellspacing="0" cellpadding="0" class="RktBlk RForeground"><tr><td><span class="RktPn">(</span><a name="(form._((lib._racket/private/class-internal..rkt)._define-serializable-class*))"></a><span title="Provided from: racket/class, racket | Package: base"><span class="RktSym"><a href="objectserialize.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-serializable-class%2A%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">define-serializable-class*</a></span></span><span class="hspace"> </span><span class="RktVar">class-id</span><span class="hspace"> </span><span class="RktVar">superclass-expr</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktVar">interface-expr</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">class-clause</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Binds <span class="RktVar">class-id</span> to a class, where <span class="RktVar">superclass-expr</span>,
|
|
the <span class="RktVar">interface-expr</span>s, and the <span class="RktVar">class-clause</span>s are as in
|
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%2A%29%29" class="RktStxLink" data-pltdoc="x">class*</a></span>.</div></p><p>This form can only be used at the top level, either within a module
|
|
or outside. The <span class="RktVar">class-id</span> identifier is bound to the new
|
|
class, and <span class="RktSym">deserialize-info:</span><span class="RktVar">class-id</span> is also
|
|
defined; if the definition is within a module, then the latter is
|
|
provided from a <span class="RktSym">deserialize-info</span> submodule via <span class="RktSym"><a href="module.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._module%2B%29%29" class="RktStxLink" data-pltdoc="x">module+</a></span>.</p><p>Serialization for the class works in one of two ways:</p><ul><li><p>If the class implements the built-in interface
|
|
<span class="RktSym"><a href="objectserialize.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._externalizable~3c~25~3e%29%29" class="RktValLink" data-pltdoc="x">externalizable<%></a></span>, then an object is serialized by
|
|
calling its <span class="RktSym">externalize</span> method; the result can be
|
|
anything that is serializable (but, obviously, should not be
|
|
the object itself). Deserialization creates an instance of the
|
|
class with no initialization arguments, and then calls the
|
|
object’s <span class="RktSym">internalize</span> method with the result of
|
|
<span class="RktSym">externalize</span> (or, more precisely, a deserialized
|
|
version of the serialized result of a previous call).</p><p>To support this form of serialization, the class must be
|
|
instantiable with no initialization arguments. Furthermore,
|
|
cycles involving only instances of the class (and other such
|
|
classes) cannot be serialized.</p></li><li><p>If the class does not implement <span class="RktSym"><a href="objectserialize.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._externalizable~3c~25~3e%29%29" class="RktValLink" data-pltdoc="x">externalizable<%></a></span>,
|
|
then every superclass of the class must be either serializable
|
|
or transparent (i.e,. have <span class="RktVal">#f</span> as its
|
|
inspector). Serialization and deserialization are fully
|
|
automatic, and may involve cycles of instances.</p><p>To support cycles of instances, deserialization may create an
|
|
instance of the call with all fields as the undefined value,
|
|
and then mutate the object to set the field
|
|
values. Serialization support does not otherwise make an
|
|
object’s fields mutable.</p></li></ul><p>In the second case, a serializable subclass can implement
|
|
<span class="RktSym"><a href="objectserialize.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._externalizable~3c~25~3e%29%29" class="RktValLink" data-pltdoc="x">externalizable<%></a></span>, in which case the <span class="RktSym">externalize</span>
|
|
method is responsible for all serialization (i.e., automatic
|
|
serialization is lost for instances of the subclass). In the first
|
|
case, all serializable subclasses implement
|
|
<span class="RktSym"><a href="objectserialize.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._externalizable~3c~25~3e%29%29" class="RktValLink" data-pltdoc="x">externalizable<%></a></span>, since a subclass implements all of the
|
|
interfaces of its parent class.</p><p>In either case, if an object is an immediate instance of a subclass
|
|
(that is not itself serializable), the object is serialized as if it
|
|
was an immediate instance of the serializable class. In particular,
|
|
overriding declarations of the <span class="RktSym">externalize</span> method are ignored
|
|
for instances of non-serializable subclasses.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><table cellspacing="0" cellpadding="0" class="RktBlk RForeground"><tr><td><span class="RktPn">(</span><a name="(form._((lib._racket/private/class-internal..rkt)._define-serializable-class))"></a><span title="Provided from: racket/class, racket | Package: base"><span class="RktSym"><a href="objectserialize.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-serializable-class%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">define-serializable-class</a></span></span><span class="hspace"> </span><span class="RktVar">class-id</span><span class="hspace"> </span><span class="RktVar">superclass-expr</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">class-clause</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Like <span class="RktSym"><a href="objectserialize.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-serializable-class%2A%29%29" class="RktStxLink" data-pltdoc="x">define-serializable-class*</a></span>, but without interface
|
|
expressions (analogous to <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%29%29" class="RktStxLink" data-pltdoc="x">class</a></span>).</div></p><p><div class="SIntrapara"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>interface</p></div></div><p class="RForeground"><a name="(def._((lib._racket/private/class-internal..rkt)._externalizable~3c~25~3e))"></a><span title="Provided from: racket/class, racket | Package: base"><span class="RktSym"><a href="objectserialize.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._externalizable~3c~25~3e%29%29" class="RktValDef RktValLink" data-pltdoc="x">externalizable<%></a></span></span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._interface~3f%29%29" class="RktValLink" data-pltdoc="x">interface?</a></span></p></blockquote></td></tr></table></div><div class="SIntrapara">The <span class="RktSym"><a href="objectserialize.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._externalizable~3c~25~3e%29%29" class="RktValLink" data-pltdoc="x">externalizable<%></a></span> interface includes only the
|
|
<span class="RktSym">externalize</span> and <span class="RktSym">internalize</span> methods. See
|
|
<span class="RktSym"><a href="objectserialize.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-serializable-class%2A%29%29" class="RktStxLink" data-pltdoc="x">define-serializable-class*</a></span> for more information.</div><div class="SIntrapara"><blockquote class="leftindent"></blockquote></div></p><div class="navsetbottom"><span class="navleft"><form class="searchform"><input class="searchbox" id="searchbox" type="text" tabindex="1" placeholder="...search manuals..." title="Enter a search string to search the manuals" onkeypress="return DoSearchKey(event, this, "8.6", "../");"/></form> <a href="https://docs.racket-lang.org/index.html" title="up to the documentation top" data-pltdoc="x" onclick="return GotoPLTRoot("8.6");">top</a><span class="tocsettoggle"> <a href="javascript:void(0);" title="show/hide table of contents" onclick="TocsetToggle();">contents</a></span></span><span class="navright"> <a href="objectequality.html" title="backward to "6.8 Object Equality and Hashing"" data-pltdoc="x">← prev</a> <a href="mzlib_class.html" title="up to "6 Classes and Objects"" data-pltdoc="x">up</a> <a href="objectprinting.html" title="forward to "6.10 Object Printing"" data-pltdoc="x">next →</a></span> </div></div></div><div id="contextindicator"> </div></body></html> |