/// <exception cref="System.IO.IOException" />
        private IFieldDefinition SetPosition(string fieldName, FieldType fieldType)
        {
            if (_raw)
            {
                throw new SerializationException(
                          "Cannot write Portable fields after getRawDataOutput() is called!");
            }
            var fd = _cd.GetField(fieldName);

            if (fd == null)
            {
                throw new SerializationException("Invalid field name: '" + fieldName +
                                                 "' for ClassDefinition {id: " + _cd.ClassId +
                                                 ", version: " + _cd.Version + "}");
            }
            if (_writtenFields.Add(fieldName))
            {
                var pos   = _out.Position;
                var index = fd.Index;
                _out.Write(_offset + index * BytesExtensions.SizeOfInt, pos);
                _out.Write((short)fieldName.Length);
                _out.WriteAsBytes(fieldName);
                _out.Write((byte)fieldType);
            }
            else
            {
                throw new SerializationException("Field '" + fieldName + "' has already been written!");
            }
            return(fd);
        }