Я работаю над проектом, где я создаю массив байтов, который почти похож на сериализацию графа объектов. Каждый класс отвечает за запись своих собственных данных, поэтому я думаю об использовании 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);
}
}
}
Я тоже был в тупике с очень похожим вопросом в последнее время и понял также, что кажется, что вы можете/должны практически иметь только один двоичный писатель, связанный с определенным потоком, потому что, как только вы закроете один двоичный писатель (согласно документации) поток также закрыт. У меня нет лучших решений, чем те, которые вы описываете:
Я выбрал выбор номер 1. Хотя я еще не закончил свою реализацию, мне лучше знать размер того, что будет написано, прежде чем писать что-либо в поток. Он чувствует себя более изобретательно, чтобы писать фиктивные ценности и прыгать вокруг потока. И это, вероятно, больше похоже на то, как BinaryWriter записывает строки внутри. Вы, или вы считали, наследуете от BinaryWriter, чтобы добавить свои собственные функции Write?