private DefaultPortableReader CreateReader(ObjectDataInput input, int factoryId, int classId, int version, int portableVersion) { var effectiveVersion = version; if (version < 0) { effectiveVersion = _context.GetVersion(); } var cd = _context.LookupClassDefinition(factoryId, classId, effectiveVersion); if (cd == null) { var begin = input.Position; cd = _context.ReadClassDefinition(input, factoryId, classId, effectiveVersion); input.Position = begin; } DefaultPortableReader reader; if (portableVersion == effectiveVersion) { reader = new DefaultPortableReader(this, input, cd); } else { reader = new MorphingPortableReader(this, input, cd); } return(reader); }
/// <exception cref="System.IO.IOException"></exception> internal DefaultPortableReader CreateReader(ObjectDataInput input) { var factoryId = input.ReadInt(); var classId = input.ReadInt(); var version = input.ReadInt(); return(CreateReader(input, factoryId, classId, version, version)); }
internal DefaultPortableReader CreateMorphingReader(ObjectDataInput input) { var factoryId = input.ReadInt(); var classId = input.ReadInt(); var version = input.ReadInt(); var portable = CreateNewPortableInstance(factoryId, classId); var portableVersion = FindPortableVersion(factoryId, classId, portable); return(CreateReader(input, factoryId, classId, version, portableVersion)); }
/// <exception cref="System.IO.IOException"/> internal IPortable Read(ObjectDataInput @in, int factoryId, int classId) { var version = @in.ReadInt(); var portable = CreateNewPortableInstance(factoryId, classId); var portableVersion = FindPortableVersion(factoryId, classId, portable); var reader = CreateReader(@in, factoryId, classId, version, portableVersion); portable.ReadPortable(reader); reader.End(); return(portable); }
public DefaultPortableReader(PortableSerializer serializer, ObjectDataInput @in, IClassDefinition cd) { _in = @in; Serializer = serializer; Cd = cd; int fieldCount; try { // final position after portable is read _finalPosition = @in.ReadInt(); // field count fieldCount = @in.ReadInt(); } catch (IOException e) { throw new SerializationException(e); } if (fieldCount != cd.GetFieldCount()) { throw new InvalidOperationException("Field count[" + fieldCount + "] in stream does not match " + cd); } _offset = @in.Position; }
private static void ReturnDataInput(ObjectDataInput input) { //TODO pooling input.Dispose(); }
/// <exception cref="System.IO.IOException" /> internal IClassDefinition ReadClassDefinition(ObjectDataInput @in, int factoryId, int classId, int version) { var register = true; var builder = new ClassDefinitionBuilder(factoryId, classId, version); // final position after portable is read @in.ReadInt(); // field count var fieldCount = @in.ReadInt(); var offset = @in.Position; for (var i = 0; i < fieldCount; i++) { var pos = @in.ReadInt(offset + i * BytesExtensions.SizeOfInt); @in.Position = pos; var len = @in.ReadShort(); var chars = new char[len]; for (var k = 0; k < len; k++) { chars[k] = (char)@in.ReadByte(); } var type = (FieldType)(@in.ReadByte()); var name = new string(chars); var fieldFactoryId = 0; var fieldClassId = 0; int fieldVersion = version; if (type == FieldType.Portable) { // is null if (@in.ReadBoolean()) { register = false; } fieldFactoryId = @in.ReadInt(); fieldClassId = @in.ReadInt(); if (register) { fieldVersion = @in.ReadInt(); ReadClassDefinition(@in, fieldFactoryId, fieldClassId, fieldVersion); } } else { if (type == FieldType.PortableArray) { var k1 = @in.ReadInt(); fieldFactoryId = @in.ReadInt(); fieldClassId = @in.ReadInt(); if (k1 > 0) { var p = @in.ReadInt(); @in.Position = p; fieldVersion = @in.ReadInt(); ReadClassDefinition(@in, fieldFactoryId, fieldClassId, fieldVersion); } else { register = false; } } } builder.AddField(new FieldDefinition(i, name, type, fieldFactoryId, fieldClassId, fieldVersion)); } var classDefinition = builder.Build(); if (register) { classDefinition = RegisterClassDefinition(classDefinition); } return(classDefinition); }