/// <exception cref="System.IO.IOException"/>
        internal void WriteInternal(IBufferObjectDataOutput output, IPortable p)
        {
            var cd = _context.LookupOrRegisterClassDefinition(p);

            output.WriteInt(cd.GetVersion());
            var writer = new DefaultPortableWriter(this, output, cd);

            p.WritePortable(writer);
            writer.End();
        }
 /// <exception cref="System.IO.IOException" />
 public DefaultPortableWriter(PortableSerializer serializer, IBufferObjectDataOutput @out, IClassDefinition cd)
 {
     this.serializer = serializer;
     this.@out = @out;
     this.cd = cd;
     writtenFields = new HashSet<string>(); //cd.GetFieldCount()
     begin = @out.Position();
     // room for final offset
     @out.WriteZeroBytes(4);
     @out.WriteInt(cd.GetFieldCount());
     offset = @out.Position();
     // one additional for raw data
     var fieldIndexesLength = (cd.GetFieldCount() + 1)*Bits.IntSizeInBytes;
     @out.WriteZeroBytes(fieldIndexesLength);
 }
        /// <exception cref="System.IO.IOException" />
        public DefaultPortableWriter(PortableSerializer serializer, IBufferObjectDataOutput @out, IClassDefinition cd)
        {
            _serializer    = serializer;
            _out           = @out;
            _cd            = cd;
            _writtenFields = new HashSet <string>(); //cd.GetFieldCount()
            _begin         = @out.Position();
            // room for final offset
            @out.WriteZeroBytes(4);
            @out.WriteInt(cd.GetFieldCount());
            _offset = @out.Position();
            // one additional for raw data
            var fieldIndexesLength = (cd.GetFieldCount() + 1) * Bits.IntSizeInBytes;

            @out.WriteZeroBytes(fieldIndexesLength);
        }
 /// <exception cref="System.IO.IOException" />
 public virtual void WriteInt(string fieldName, int value)
 {
     SetPosition(fieldName, FieldType.Int);
     _out.WriteInt(value);
 }