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); } }
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); } }