65.9K
CodeProject 正在变化。 阅读更多。
Home

对象读取器和写入器

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.33/5 (3投票s)

Mar 23, 2008

LGPL3
viewsIcon

28481

downloadIcon

177

从流中读取/写入对象

引言

几天前,我正在编写一个程序,需要解析一个TrueType字体。我发现没有类可以从流中填充结构体。所以我自己写了一个。

Using the Code

基本上,如果你只想读取/写入满足以下条件的结构体...

  1. 所有数据都存储在字段中
  2. 所有数据都是原始类型

...这将非常容易,就像这样

'reader can be BinaryReader or Stream
result = ObjectReader(Of SomeStruct).Read(reader)
 
'writer can be BinaryWriter or Stream
ObjectWriter(Of SomeStruct).Write(obj, writer) 

数组和非原始类型也可以读取/写入,但你需要为字段添加一些属性。这里有一个例子

<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

历史

  • 2008-03-24:初始发布
© . All rights reserved.