Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / VB

Object Reader and Writer

2.33/5 (3 votes)
23 Mar 2008LGPL3 1   162  
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...

  1. All data is stored in fields
  2. All data is primitive type

... it will be very easy, like this:

VB.NET
'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:

VB.NET
<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

License

This article, along with any associated source code and files, is licensed under The GNU Lesser General Public License (LGPLv3)