Visual Basic 9 (2008)Windows Vista.NET 3.0Windows XP.NET 2.0.NET 3.5IntermediateWindows.NETVisual Basic
Object Reader and Writer
Reads/Writes an object from/to a stream
Introduction
Some days ago, I was writing a program that needed to parse a truetype font. I found that there is no class to fill a structure from a stream. So I wrote one myself.
Using the Code
Basically, if you only want to read/write a structure with the following conditions...
- All data is stored in fields
- All data is primitive type
... it will be very easy, like this:
'reader can be BinaryReader or Stream
result = ObjectReader(Of SomeStruct).Read(reader)
'writer can be BinaryWriter or Stream
ObjectWriter(Of SomeStruct).Write(obj, writer)
Arrays and non-primitive types can also be read/written, but you need to add some attribute to the field. Here is an example:
<System.Runtime.InteropServices.StructLayout_
(Runtime.InteropServices.LayoutKind.Sequential)> _
Public Structure TestStruct
Public aInt As Integer
Public bInt64 As Long
<ArraySize(16)> _
Public bArr As Byte()
<ArraySize(4)> _
Public dIArr As Integer()
<ObjectReaderWriterInclude()> _
Public eNested As TestStruct3
Public fNotInclude As TestStruct2 ' this field will not be read/written
<ObjectReaderWriterInclude()> _
Public gNested2 As TestStruct2
<ArraySize(2), ObjectReaderWriterInclude()> _
Public hNestedArray As TestStruct2()
End Structure
<System.Runtime.InteropServices.StructLayout_
(Runtime.InteropServices.LayoutKind.Sequential)> _
Public Structure TestStruct2
Public aB As Byte
<ArraySize(10)> _
Public bBArr As Byte()
End Structure
<System.Runtime.InteropServices.StructLayout_
(Runtime.InteropServices.LayoutKind.Sequential)> _
Public Class TestStruct3
Public aInt As Integer
<ObjectReaderWriterInclude()> _
Public bNested As TestStruct2
End Class
History
- 2008-03-24: Initial post