Exemple #1
0
        private Variant ReadObject(EncodingKind kind)
        {
            switch (kind)
            {
            case EncodingKind.ObjectRef_4Bytes:
                return(Variant.FromObject(_referenceMap.GetValue(_reader.ReadInt32())));

            case EncodingKind.ObjectRef_1Byte:
                return(Variant.FromObject(_referenceMap.GetValue(_reader.ReadByte())));

            case EncodingKind.ObjectRef_2Bytes:
                return(Variant.FromObject(_referenceMap.GetValue(_reader.ReadUInt16())));

            case EncodingKind.Object:
                int id = _referenceMap.GetNextReferenceId();

                Type type = this.ReadType();

                Func <ObjectReader, object> typeReader;
                if (!_binder.TryGetReader(type, out typeReader))
                {
                    throw NoSerializationReaderException(type.FullName);
                }

                if (_recursive)
                {
                    // recursive: read and construct instance immediately from member elements encoding next in the stream
                    var instance = typeReader(this);
                    _referenceMap.SetValue(id, instance);
                    return(Variant.FromObject(instance));
                }
                else
                {
                    uint memberCount = this.ReadCompressedUInt();

                    if (memberCount == 0)
                    {
                        return(ConstructObject(type, (int)memberCount, typeReader, id));
                    }
                    else
                    {
                        // non-recursive: remember construction information to invoke later when member elements available on the stack
                        _constructionStack.Push(Construction.CreateObjectConstruction(type, (int)memberCount, _valueStack.Count, typeReader, id));
                        return(Variant.None);
                    }
                }

            default:
                throw ExceptionUtilities.UnexpectedValue(kind);
            }
        }
Exemple #2
0
        private Variant ReadObject(EncodingKind kind)
        {
            switch (kind)
            {
            case EncodingKind.ObjectRef_4Bytes:
                return(Variant.FromObject(_referenceMap.GetValue(_reader.ReadInt32())));

            case EncodingKind.ObjectRef_1Byte:
                return(Variant.FromObject(_referenceMap.GetValue(_reader.ReadByte())));

            case EncodingKind.ObjectRef_2Bytes:
                return(Variant.FromObject(_referenceMap.GetValue(_reader.ReadUInt16())));

            case EncodingKind.Object:
                int id = _referenceMap.GetNextReferenceId();

                Type type        = this.ReadType();
                uint memberCount = this.ReadCompressedUInt();

                Func <ObjectReader, object> typeReader;
                if (!_binder.TryGetReader(type, out typeReader))
                {
                    throw NoSerializationReaderException(type.FullName);
                }

                if (memberCount == 0)
                {
                    return(ConstructObject(type, (int)memberCount, typeReader, id));
                }
                else
                {
                    _constructionStack.Push(Construction.CreateObjectConstruction(type, (int)memberCount, _valueStack.Count, typeReader, id));
                    return(Variant.None);
                }

            default:
                throw ExceptionUtilities.UnexpectedValue(kind);
            }
        }