Я пытаюсь увидеть, есть ли способ избавиться от чтения в моем потоке в MemoryStream перед десериализацией объекта, который был сохранен через ProtoBuf.Net.
Я не могу использовать функции Protobuf.Net With LengthPrefix, потому что я возвращаюсь и корректирую записи в файле по мере записи новых записей, чтобы файл можно было перемещать вперед или назад. Сериализованный класс не требует изменений, потому что я сохраняю 3 длины отдельно от фактического класса.
Это код, который я сейчас использую для чтения записи:
Private Function ReadEntry(ByVal br As BinaryReader) As PacketErrorLogEntry
Dim activeRecord As PacketErrorLogEntry
Dim OffsetPrevious As UInt32 = br.ReadUInt32()
Dim RecordLength As UInt32 = br.ReadUInt32
Dim OffsetNext As UInt32 = br.ReadUInt32
Using ms As New MemoryStream
Dim readLength As UInt32
Dim bytesRead As UInt32
Dim writeBuffer As Byte() = CType(Array.CreateInstance(GetType(Byte), _
4096), Byte())
Dim bytesToRead As UInt32 = CType(writeBuffer.Length, UInt32)
If bytesToRead > RecordLength Then
bytesToRead = RecordLength
End If
bytesRead = 0
While readLength < RecordLength
bytesRead = CType(br.BaseStream.Read(writeBuffer, 0, _
CType(bytesToRead, Integer)), UInt32)
ms.Write(writeBuffer, 0, CType(bytesRead, Integer))
readLength += bytesRead
End While
ms.Flush()
ms.Position = 0
activeRecord = Serializer.Deserialize(Of PacketErrorLogEntry)(ms)
activeRecord.PreviousRecordLocation = OffsetPrevious
activeRecord.NextRecordLocation = OffsetNext
End Using
'activeRecord = Serializer.Deserialize(Of PacketErrorLogEntry)(br.BaseStream, RecordLength)
'activeRecord.PreviousRecordLocation = OffsetPrevious
'activeRecord.NextRecordLocation = OffsetNext
Return activeRecord
End Function
Я надеялся, что смогу достичь, так это того, что, передав параметр Length to Read функции Deserialize, я смогу избавиться от всего блока MemoryStream и просто вернуть свой объект.
Я использую BinaryReader / Writer для длины / смещения, чтобы я мог вернуться позже и просто перезаписать эти позиции обновленными значениями.