Rebol3 Code Examplex


Object serialization

Save and restore objects in a structured format.

Rebol [
    title: "Rosetta code: Object serialization"
    file: %Object_serialization.r3
    url: https://rosettacode.org/wiki/Object_serialization
    needs: 2.7.0
]
; ----------------------------
; Define a base "class" Person
; ----------------------------
; In Rebol, `make object! [...]` creates an object with defined fields (and optionally functions).
; Here, Person has two properties: name (string) and age (integer).
Person: make object! [
    name: ""
    age: 0
]

; ------------------------------------------------
; "Inherit" a subclass Student from Person
; ------------------------------------------------
; Since Rebol doesn't have classical inheritance, `make Person [...]`
; makes a copy of the Person object and lets you add or override fields.
; Student adds an extra property: grade (e.g., "A", "B", etc.)
Student: make Person [
    grade: ""
]

; ------------------------------------------------
; Inherit another subclass Teacher from Person
; ------------------------------------------------
; Teacher adds an extra property: subject (teaching subject)
Teacher: make Person [
    subject: ""
]

; ----------------------------------
; Create specific instances of each
; ----------------------------------
; Values in brackets override default properties when creating the object.
john:  make Person  [name: "John"  age: 40]
sally: make Student [name: "Sally" age: 18 grade: "A"]
bob:   make Teacher [name: "Bob"   age: 50 subject: "Math"]

; ------------------------------------------------
; Print text in yellow (assuming ANSI color functions are set up)
; ------------------------------------------------
print "Original instances:"

; ------------------------------------------------
; `probe` prints the value in developer-readable format and returns it
; This is useful for quickly seeing object content
; ------------------------------------------------
probe john
probe sally
probe bob

; ------------------------------------------------
; Create a block containing all three objects
; `reduce` evaluates each word and inserts its value into the block
; ------------------------------------------------
objects: reduce [john sally bob]

; ------------------------------------------------
; Save all object data (including words, values, and types) to a file
; `save/all` preserves the complete object structure
; ------------------------------------------------
save/all %objects.dat objects

; ------------------------------------------------
; Show header for loaded instances
; ------------------------------------------------
print "Loaded instances:"

; ------------------------------------------------
; Load objects back from the file
; `load` reconstructs the original structures from the saved format
; ------------------------------------------------
read-objects: load %objects.dat

; ------------------------------------------------
; Iterate over loaded objects and display them
; ------------------------------------------------
foreach obj read-objects [
    probe obj
]