Читайте строка от массива байтов (не преобразовывают массив байтов для строкового представления),

Сохранение сессии в течение такого долгого времени может быть плохой идеей - данные неактивных сеансов будут потреблять ресурсы вашего сервера и могут замедлять некоторые операции. В Yii есть специальная функция для таких случаев - вы можете установить $enableAutoLogin на true:

'user' => [
    'enableAutoLogin' => true,
    // ...
],

И на login() установить тайм-аут вызова для файла cookie идентификации:

[ 111]

Он установит специальный cookie-файл (действительный в течение года) с идентификационной информацией, который автоматически авторизует пользователя по истечении срока его сеанса. Таким образом, вам не нужно хранить данные сеанса на вашем сервере в течение года, но с точки зрения пользователя похоже, что он всегда входит в систему (даже если в фоновом режиме создается новый сеанс).

7
задан abatishchev 13 December 2012 в 08:22
поделиться

2 ответа

Лично я был бы

  1. Поместите Int16 в начале строк, таким образом, Вы знаете, сколько времени они собираются быть, и
  2. Используйте класс IO.BinaryReader, чтобы сделать чтение, он будет "читать", ints, строки, символы и т.д. в переменную, например, BinReader. ReadInt16 () считает два байта, возвратить int16, который они представляют, и движение в два байта в потоке

Надеюсь, это поможет.

P.S. Будьте тщательным использованием метода ReadString, оно предполагает, что строка предварительно ожидается с пользовательскими целыми числами на 7 битов т.е. что оно было записано классом BinaryWriter. Следующее из этого сообщения CodeGuru

Класс BinaryWriter имеет два метода для записи строк: перегруженная Запись () метод и WriteString () метод. Бывшие записи строка как поток байтов согласно кодированию класса используют. WriteString () метод также использует указанное кодирование, но это префиксы поток строки байтов с фактической длиной строки. Такие снабженные префиксом строки читаются назад на пути BinaryReader. ReadString ().

Интересная вещь о длине оценивает его, что как можно меньше байтов используется для содержания этого размера, она хранится как тип, названный 7-разрядным закодированным целым числом. Если длина помещается в байт 7 битов за сингл, используется, если это больше, чем это затем, верхний уровень обдумал первый байт, установлен, и второй байт создается путем смещения значения на 7 битов. Это повторяется с последовательными байтами, пока нет достаточно байтов для содержания значения. Этот механизм используется, чтобы удостовериться, что длина не становится значительной частью размера, поднятого сериализированной строкой. BinaryWriter и BinaryReader имеют методы, чтобы считать и записать 7-разрядные закодированные целые числа, но они защищены и таким образом, можно использовать их, только если Вы происходите из этих классов.

9
ответ дан 6 December 2019 в 15:32
поделиться

Я пошел бы со снабженными префиксом длину строками. Это сделает Вашу жизнь намного более простой, и это означает, что можно представить строки с разрывами строки в. Несколько комментариев к Вашему коду, хотя:

  • Не используйте Поток. DataAvailable. Просто, потому что нет доступных данных, теперь не означает, что Вы считали конец потока.
  • Если Вы не будете абсолютно уверены, что Вам никогда не будет нужен текст вне ASCII, не используйте ASCIIEncoding.
  • Не принимайте тот Поток. Read считает все данные, к которым Вы спрашиваете это. Всегда проверяйте возвращаемое значение.
  • BinaryReader делает многое из этого намного легче (включая снабженные префиксом длину строки и Чтение, что циклы, пока он не читается, что Вы спросили это к),
  • Вы называете BitConverter. ToUInt16 дважды на тех же данных. Почему?
5
ответ дан 6 December 2019 в 15:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: