Encoding Flush
От: Аноним  
Дата: 17.06.10 11:03
Оценка:
В упор не пойму что это такое. Понятно для чего нужно в стримах, но тут то зачем?
Re: Encoding Flush
От: nikov США http://www.linkedin.com/in/nikov
Дата: 17.06.10 11:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В упор не пойму что это такое.


А где ты его нашёл?
Re[2]: Encoding Flush
От: Аноним  
Дата: 17.06.10 12:09
Оценка:
Здравствуйте, nikov, Вы писали:

N>А где ты его нашёл?


http://msdn.microsoft.com/en-us/library/system.text.encoder.aspx

When the application is done with a stream of data it should make sure that the state information is flushed by setting the flush parameter to true in the appropriate method call. If an exception occurs or if the application switches streams, it should call Reset to clear the internal state of the Encoder object.


Зачем нужно чистить внутреннее состояние —
Re[3]: Encoding Flush
От: hooky-mars  
Дата: 18.06.10 09:51
Оценка:
Чтобы использовать по новой, без создания объекта?
Re[3]: Encoding Flush
От: Jolly Roger  
Дата: 18.06.10 10:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Зачем нужно чистить внутреннее состояние —


В некоторых алгоритмах результат следующей операции кодирования/декодирования зависит от предыдущей. В качестве примера можно привести Base64. Поэтому энкодер и декодер должен помнить предыдущий результат. Чтобы сообщить ему, что далее результат не надо, а нужно со следующего вызова начать новый сеанс, и предназначен, вероятно, данный параметр.
"Нормальные герои всегда идут в обход!"
Re[4]: Encoding Flush
От: Аноним  
Дата: 18.06.10 10:45
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>В некоторых алгоритмах результат следующей операции кодирования/декодирования зависит от предыдущей. В качестве примера можно привести Base64. Поэтому энкодер и декодер должен помнить предыдущий результат. Чтобы сообщить ему, что далее результат не надо, а нужно со следующего вызова начать новый сеанс, и предназначен, вероятно, данный параметр.


В .NET Base64 кодируется не через Encoder, а через Convert. Какие кодировки нужно чистить?
Re[5]: Encoding Flush
От: Jolly Roger  
Дата: 18.06.10 11:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В .NET Base64 кодируется не через Encoder, а через Convert. Какие кодировки нужно чистить?


Encoder — абстрактный класс, потомки которого обращаются к Encoding — тоже абстрактному, а среди его потомков, кроме прочих, есть и internal class Base64Encoding. Да даже если сейчас этот параметр был-бы не нужен, не факт, что он не потребуется в каком-то потомке в будущем.

Я не понял, Вы чем-то недовольны? Вас этот параметр раздражает? Ну так пожалуйтесь в Микрософт.
"Нормальные герои всегда идут в обход!"
Re[6]: Encoding Flush
От: Аноним  
Дата: 18.06.10 11:28
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Я не понял, Вы чем-то недовольны? Вас этот параметр раздражает? Ну так пожалуйтесь в Микрософт.


Я хочу понять, когда мне его вызывать, а когда нет. Особенно, когда я работаю с таким классом как StreamWriter, который этот параметр игнорирует.
Re[7]: Encoding Flush
От: Jolly Roger  
Дата: 18.06.10 11:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я хочу понять, когда мне его вызывать, а когда нет. Особенно, когда я работаю с таким классом как StreamWriter, который этот параметр игнорирует.


Покажите пример кода, в котором возникают сомнения, попробуем разобраться сообща
"Нормальные герои всегда идут в обход!"
Re[8]: Encoding Flush
От: Аноним  
Дата: 18.06.10 13:16
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Покажите пример кода, в котором возникают сомнения, попробуем разобраться сообща


У StreamWriter есть сво-во AutoFlush. В описании его написано

Setting AutoFlush to true means that data will be flushed from the buffer to the stream, but the encoder state will not be flushed. This allows the encoder to keep its state (partial characters) so that it can encode the next block of characters correctly. This scenario affects UTF8 and UTF7 where certain characters can only be encoded after the encoder receives the adjacent character or characters.


Тоесть, StreamWriter умеет работать только с теми Encoding, которым не требуется очистка состояния. На основе этого я пытаюсь понять, а каким вообще кодировкам такое требуется (для чего уже выяснили, спасибо). У меня приложение под Нет и под Моно. Поэтому мне критично понимать, будут ли баги с кодировками на других платформах.
Re[9]: Encoding Flush
От: Jolly Roger  
Дата: 18.06.10 13:38
Оценка: 62 (1)
Здравствуйте, Аноним, Вы писали:

А>Тоесть, StreamWriter умеет работать только с теми Encoding, которым не требуется очистка состояния.


Ну почему-же. У StreamWriter есть метод Flush()

public override void Flush()
{
    this.Flush(true, true);
}


обращающийся к внутреннему методу, который определён так

private void Flush(bool flushStream, bool flushEncoder)


Вот второй параметр и перенаправляется в нём энкодеру. То есть просто имеет место некоторое разделение интерфейса на собственно запись стрима и сброс внутренних буферов, которая сопровождается и зачисткой энкодера.
"Нормальные герои всегда идут в обход!"
Re: Encoding Flush
От: Sinix  
Дата: 18.06.10 14:05
Оценка: 3 (1)
Здравствуйте, Аноним, Вы писали:

А>В упор не пойму что это такое. Понятно для чего нужно в стримах, но тут то зачем?

У Рихтера обсуждалось. Нужен для многобайтных кодировок. Например — в utf8 цепочка символов может разорваться по границе используемого буфера. Чтобы не кодировать следующий пакет в мусор, encoder хранит внутри себя байты недописанного символа. Если encoder использовать для другого потока (stream), он добавит незаписанные байты в его начало — получим всё тот же мусор при декодинге. Аналогично — для decoder'а.
Re[10]: Encoding Flush
От: Аноним  
Дата: 21.06.10 11:16
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>обращающийся к внутреннему методу, который определён так


JR>
JR>private void Flush(bool flushStream, bool flushEncoder)
JR>


JR>Вот второй параметр и перенаправляется в нём энкодеру. То есть просто имеет место некоторое разделение интерфейса на собственно запись стрима и сброс внутренних буферов, которая сопровождается и зачисткой энкодера.


Узнав об этом методе и была создана тема. Только это мало что объясняет. Вопрос не в том, какое там разделение, а в том, почему StreamWriter не поддерживает сброс кодировок и когда надо вызывать сброс состояния у кодировки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.