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(SmalltalkPointerObject obj, XElement xmlObject)
        {
            if (obj.Class.ClassName == SmalltalkClass.OrderedCollectionClassName)
            {
                int startPosition = (int)obj.InstVars[0].LongValue - 1; // convert to 0 based
                int endPosition   = (int)obj.InstVars[1].LongValue - 1;
                var variable      = ((SmalltalkVariableObject)obj.InstVars[2].Value);
                var size          = 0;
                ExportedObjs.Add(variable.ObjectId);// Do not export this object
                for (int i = startPosition; i <= endPosition; i++)
                {
                    size++;
                    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}");
                    }
                }
                xmlObject.SetAttributeValue("size", size);
                return;
            }

            var instVarNames = obj.Class.InstVarNames;

            for (int i = 0; i < instVarNames.Count; i++)
            {
                var nodeName = instVarNames[i];
                var value    = obj.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}");
                }
            }
        }
        private void loadInstVarIds(System.IO.Stream stream, SmalltalkArchive archive, SmalltalkPointerObject obj, int size)
        {
            for (int i = 0; i < obj.Class.InstVarNames.Count; i++)
            {
                obj.InstVars[i] = new SmalltalkValueReference(archive, readInteger(stream));
            }

            if (size > 0)
            {
                if (obj.Class.IsVariable)
                {
                    for (int i = 0; i < size; i++)
                    {
                        obj.InstVars.Add(new SmalltalkValueReference(archive, (readInteger(stream))));
                    }
                }
                else
                { // Drop filed indexed values on the floor
                    for (int i = 0; i < size; i++)
                    {
                        readInteger(stream);
                    }
                }
            }
        }