Случайный доступ и BinaryWriter?

2

Я работаю над проектом, где я создаю массив байтов, который почти похож на сериализацию графа объектов. Каждый класс отвечает за запись своих собственных данных, поэтому я думаю об использовании BinaryWriter и передаю этот экземпляр вокруг своих дочерних объектов и позволяю им сериализоваться в нем вместо создания временных буферов (байтовых массивов) и их слияния.

Тем не менее, мне нужно добавить каждую дочернюю информацию с байтом, который задает размер следующего блока, но это неизвестно до тех пор, пока ребенок не напишет все данные, и к тому времени писатель позиционируется в конце childdata. Я мог бы, конечно, создать временный буфер и передать временному BinaryWriter ребенку, а затем записать данные в "основной" BinaryWriter после этого, но это похоже на хакерское решение.

Есть ли альтернативные решения? Может быть, это плохая идея вмешаться в положение BinaryWriter? Я хотел бы избежать создания временных буферов/писателей, если это возможно, и просто позволить каждому ребенку записать мой "основной" сценарий/буфер

Решение ниже может работать, но немного хакерское. Есть ли более приятные решения? (Я его не тестировал, поэтому, возможно, не полностью выровнен по байтам)

public abstract class BaseObject 
{
      public abstract void Serialize(BinaryWriter writer);
}



public class Program() 
{

  public static void Main() 
  {
       List<BaseObject> myChildren = new List<BaseObject>();

       // ... Initialize children here..

       MemoryStream memoryStream = new MemoryStream();
       BinaryWriter writer = new BinaryWriter(memoryStream);

       foreach (BaseObject child in myChildren) {
           writer.Write((byte)0); // Dummy placeholder. Length is a byte
           long sizePosition = writer.BaseStream.Position;
           child.Serialize(writer);
           long currentPosition = writer.BaseStream.Position;
           writer.Seek(sizePosition, SeekOrigin.Begin);
           writer.Write((byte)currentPosition-sizePosition);
           writer.Seek(currentPosition , SeekOrigin.Begin);
       }
   }
}
  • 0
    Это потому, что мне не принадлежит формат. То, что я действительно пытаюсь сделать, это сериализацию параметров DHCP ...
Теги:
binary-data

1 ответ

2

Я тоже был в тупике с очень похожим вопросом в последнее время и понял также, что кажется, что вы можете/должны практически иметь только один двоичный писатель, связанный с определенным потоком, потому что, как только вы закроете один двоичный писатель (согласно документации) поток также закрыт. У меня нет лучших решений, чем те, которые вы описываете:

  • Запишите данные в MemoryStream, а затем напишите размер и содержимое потока памяти в основной поток. Это может быть удобно, если вы хотите разрешить некоторым объектам использовать другой тип писателя помимо BinaryWriter.
  • Помните свою текущую позицию, напишите значение 0, а затем блок данных. Затем перемотайте в значение 0 и замените его на письменный размер, затем вернитесь к концу.

Я выбрал выбор номер 1. Хотя я еще не закончил свою реализацию, мне лучше знать размер того, что будет написано, прежде чем писать что-либо в поток. Он чувствует себя более изобретательно, чтобы писать фиктивные ценности и прыгать вокруг потока. И это, вероятно, больше похоже на то, как BinaryWriter записывает строки внутри. Вы, или вы считали, наследуете от BinaryWriter, чтобы добавить свои собственные функции Write?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню