This is the third and last of my posts about the Marshal format. The first part introduced the format and some straight-forward serializations. The second part touched on strings and object links. This post rounds us off with regexes, classes, modules, and instances of objects.
Regexes
/hello/
0408 492f 0a68 656c 6c6f 0006 3a06 4546
Like strings, regexes are surrounded by an IVAR. The typecode 2f
is
ASCII /
and denotes that this object is a regex. The length of the
string follows, again encoded as an integer. The regex string is
stored as a set of bytes, and must be interpreted with the string
encoding from the IVAR. After the string, the regex options are saved.
/hello/imx
0408 492f 0a68 656c 6c6f 0706 3a06 4546
The regex option byte is a bitset of the five possible options. In
this example, ignore case, extend, and multiline are set (0x1
,
0x2
, and 0x4
respectively)
Classes
String
0408 630b 5374 7269 6e67
The typecode 63
is ASCII c
and denotes that this object is a
class. The length of the class name followed by the class name are
next.
Math::DomainError
0408 6316 4d61 7468 3a3a 446f 6d61 696e 4572 726f 72
Namespaces are separated by ::
.
Modules
Enumerable
0408 6d0f 456e 756d 6572 6162 6c65
Modules are identical to classes, except the typecode 6d
is ASCII m
.
Instances of user objects
Let’s define a small class to test with.
1 2 3 4 5 |
|
DumpTest.new(nil)
0408 6f3a 0d44 756d 7054 6573 7406 3a07 4061 30
The typecode 6f
is ASCII o
, and denotes that this is an
object. The class name is next, written as a symbol – :DumpTest
. The
number of instance variables is encoded as an integer, followed by
pairs of name, value. This example has 1 pair of instance variables,
[:@a
, nil
].