private void loadObjectDescriptors(System.IO.Stream stream, SmalltalkArchive archive)
        {
            long objectId = 0;
            var  objects  = DefaultObjects;

            while ((objectId = readInteger(stream)) != NUL)
            {
                var classId = readInteger(stream);
                var size    = (int)readInteger(stream);
                var @class  = archive.Classes[classId];
                var hash    = readInteger(stream);

                if (@class.IsBytes)
                {
                    var bytes = new byte[size];
                    stream.Read(bytes, 0, size);
                    var obj = new SmalltalkBytesObject(objectId, size, hash, @class, bytes);
                    objects.Add(objectId, obj);
                }
                else if (@class.IsVariable)
                {
                    var obj = new SmalltalkVariableObject(objectId, size, hash, @class);
                    loadInstVarIds(stream, archive, obj, size);
                    objects.Add(objectId, obj);
                }
                else
                {
                    var obj = new SmalltalkPointerObject(objectId, size, hash, @class);
                    loadInstVarIds(stream, archive, obj, size);
                    objects.Add(objectId, obj);
                }
            }
            archive.Objects = objects;
        }
 private void Export(SmalltalkVariableObject variable, XElement xmlObject)
 {
     for (int i = 0; i < variable.InstVars.Count; i++)
     {
         var nodeName = "Value";
         var value    = variable.InstVars[i];
         if (value.HasObjectValue)
         {
             xmlObject.Add(new XElement(nodeName, new XAttribute("refid", value.ObjectId)));
         }
         else if (value.HasLongValue)
         {
             xmlObject.Add(new XElement(nodeName, new XAttribute("int", value.LongValue)));
         }
         else if (value.HasCharValue)
         {
             xmlObject.Add(new XElement(nodeName, new XAttribute("char", value.CharValue)));
         }
         else
         {
             throw new NotImplementedException($"Unexpected value {value.Value}");
         }
     }
 }