Сохраните и загрузите несколько потоков памяти в один файл C #

1

У меня есть два потока памяти, каждый из которых содержит сериализованные структуры.

Возможно ли объединить эти два потока в один файл таким образом, который впоследствии может быть прочитан и извлечен обратно в исходные два потока памяти?

EDIT: я должен указать, что причина, по которой мои данные разделены на два потока, - это то, что объекты, которые они содержат, должны быть десериализованы в разное время. Благодарю!

EDIT 2: К сожалению, я использую.Net 2.0. Я не могу воспользоваться Stream.CopyTo :(

  • 0
    У вас есть способ определить точку, где потоки расходятся? Подсчет структуры, возможно?
  • 0
    Когда я создаю потоки, я знаю количество и тип сериализуемых объектов, да.
Теги:
deserialization
serialization
memorystream

2 ответа

1
Лучший ответ

Я уверен, что многие задействованные методы будут предложены. Я не поклонник сложных форматов сериализации.

Если производительность не является большой проблемой, рассмотрите просто сериализацию двух байтовых массивов. Как это:

class MyFileContents {
 public byte[] Part0;
 public byte[] Part1;
}

new BinaryFormatter().Serialize(myStream, new MyFileContents(...));

Быстро реализовать. Немного может пойти не так.

Также рассмотрите буферы протокола.

0

Здесь я написал вам небольшой фрагмент кода:

    public void CombineStreams(Stream src1, Stream src2, Stream dstStream)
    {
        using (var writer = new BinaryWriter(dstStream))
        {
            writer.Write((int) src1.Length);
            src1.CopyTo(dstStream);
            writer.Write((int) src2.Length);
            src2.CopyTo(dstStream);
        }
    }

    public void ReadCombinedStreams(Stream srcStream, out Stream outStream1, out Stream outStream2)
    {
        outStream1 = ReadInnerStream(srcStream);
        outStream2 = ReadInnerStream(srcStream);
    }

    private Stream ReadInnerStream(Stream stream)
    {
        int length;
        byte[] content;
        using (var reader = new BinaryReader(stream))
        {
            length = reader.ReadInt32();
            content = reader.ReadBytes(length);
        }

        var result = new MemoryStream(length);
        result.Write(content, 0, length);
        result.Seek(0, SeekOrigin.Begin);

        return result;
    }
  • 0
    Спасибо, это здорово. К сожалению, я использую .Net 2.0 и не могу воспользоваться Stream.CopyTo. Можете ли вы порекомендовать альтернативу, или я должен написать свой собственный?
  • 0
    Вы можете написать свой собственный метод расширения CopyTo (). Вот реализация.

Ещё вопросы

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