⚠️ Warning: This is a draft ⚠️

This means it might contain formatting issues, incorrect code, conceptual problems, or other severe issues.

If you want to help to improve and eventually enable this page, please fork RosettaGit's repository and open a merge request on GitHub.

This example uses internal implementation details and may not work in future Mozart versions.

First a module that defines a base class and functions for marshalling/unmarshalling:

functor
import
   Module
export
   Mixin
   InstantiateMarshaller
define
   class Mixin
      meth initUninitialized skip end
     
      meth toData($)
	 As = {Arity {GetClass self}.{AtomToName 'ooAttr'}}
	 Fs = {Arity {GetClass self}.{AtomToName 'ooFeat'}}
      in
	 {Map As fun {$ A} A#@A end}
	 #{Map Fs fun {$ F} F#self.F end}
      end
      
      meth fromData(Data) As#Fs = Data in
	 {ForAll As proc {$ A#V} A := V end}
	 {ForAll Fs proc {$ F#V} self.F = V end}
      end
   end

   fun {InstantiateMarshaller Classes}
      ClassByName = {List.toRecord unit
		     {List.zip
		      {Map Classes GetClassName}
		      Classes
		      fun {$ N C} N#C end}} 

      fun {Unmarshal ClassName#Data}
	 O = {New ClassByName.ClassName initUninitialized}
      in
	 {O fromData(Data)}
	 O
      end
   in
      module(marshal:Marshal
	     unmarshal:Unmarshal
	    )
   end
   
   %% Result: pair of class name and object data
   fun {Marshal Object}
      {GetClassName {GetClass Object}}#{Object toData($)}
   end

   fun {GetClassName Class}
      Class.{AtomToName 'ooPrintName'}
   end
  
   %% Get access to two internal, implementation-dependent functions
   local
      [Boot_Object Boot_Name] = {Module.link ['x-oz://boot/Object' 'x-oz://boot/Name']}
   in
      GetClass = Boot_Object.getClass
      AtomToName = Boot_Name.newUnique
   end
end

An example application, inspired by the C++ example:

functor
import
   Application
   ObjectMarshalling
   Pickle
   System
define
  local
     Count = {NewCell 1}
  in
     class Employee from ObjectMarshalling.mixin
	feat
	   name
	   department
	   id
	   
	meth init(Department Name)
	   self.name = Name
	   self.department = Department
	   self.id = Count := @Count + 1
	end
	
	meth print($)
	   "Id:"#self.id#", name: "#self.name#", dep.: "#self.department
	end
     end
  end
  
  class Worker from Employee
     feat
	salary
	
     meth init(Department Name Salary)
	Employee, init(Department Name)
	self.salary = Salary
     end
     
     meth print($)
	Employee, print($)#", wage per hour: "#self.salary
     end
  end

  Marshaller = {ObjectMarshalling.instantiateMarshaller [Employee Worker]}
  
  Employees = [{New Employee init("maintenance" "Fritz Schmalstieg")}
	       {New Employee init("repair" "John Berry")}
	       {New Worker init("maintenance" "Laurent Le Chef" 20.0)}
	       {New Worker init("IT" "Srinivan Taraman" 55.35)}
	      ]

  {System.showInfo "Original objects:"}
  for E in Employees do {System.showInfo {E print($)}} end

  {Pickle.save {Map Employees Marshaller.marshal} "objects.dat"}

  EmployeesFromDisk = {Map {Pickle.load "objects.dat"} Marshaller.unmarshal}

  {System.showInfo "Loaded objects:"}
  for E in EmployeesFromDisk do {System.showInfo {E print($)}} end

  {Application.exit 0}
end