掲示板お問い合わせランダムジャンプ



この広告は30日以上更新がないブログに表示されております。 新しい記事を書くことで広告を消すことができます。

Top Index

2005年01月24日
データファイルの読込・書出|シリアル化
VB.NETのソースをHTML化しようとしているわけですが、 VBのコマンドを全部網羅するとは大変です。

そこで、
・あらかじめコマンド辞書ファイルを用意して、それに該当する単語は予約語とする
・辞書にない単語も出ると思われるので、ユーザーが編集できるようにする
ようなファイルをつくってみることにする。

ただ単語を保存するだけなので、DB使うのもアホらしい。
CSV形式で吐き出しもいいけど、.NETっぽくない。
ということで、ぜんぜん詳しくないけど、XML形式で吐き出すことにした。

MSDNを見ると、「シリアル化」なる言葉がでてきます。
まったく聞いたことがないんですけど、どうやら
クラス(オブジェクト)そのものをデータ化することをシリアル化というそうです。
また、それらのデータを元に戻すことを逆シリアル化というそうです。

まず、データ上は単語を複数格納できる型で管理したいので、ArrayList型を使おうかと思います。
ArrayList型で配列をやり取りするのは簡単で、「Addメソッド」や、「Removeメソッド」を使えばこと足ります。
そして、編集を加えたArrayListをシリアル化してXMLファイルを作成。
さらに、逆シリアル化をし、XMLファイルからArrayListができれば完璧というわけですね。

以下、完成品です。

1 Public Class VBCommandsFactory
2     'VBコマンドXMLファイルの作成
3     Public Sub ExportXML(ByVal Path As String, ByVal CommandArray As ArrayList)
4         Dim Serializer As New System.Xml.Serialization.XmlSerializer(GetType(ArrayList))
5         Dim FileStream As System.IO.FileStream
6 
7         Try
8             FileStream = New System.IO.FileStream(Path, IO.FileMode.Create)
9         Catch ex As Exception
10             Throw New VBCommandsFactoryException("VBコマンドファイルの新規作成に失敗しました", ex)
11         End Try
12 
13         Dim Writer As New System.IO.StreamWriter(FileStream)
14 
15         Try
16             Serializer.Serialize(Writer, CommandArray)
17         Catch ex As Exception
18             Throw New VBCommandsFactoryException("VBコマンドファイルのシリアル化に失敗しました", ex)
19         Finally
20             FileStream.Close()
21         End Try
22     End Sub
23 
24     'VBコマンドXMLファイルの読込
25     Public Function ImportXML(ByVal Path As StringAs ArrayList
26         Dim Serializer As New System.Xml.Serialization.XmlSerializer(GetType(ArrayList))
27         Dim CommandArray As ArrayList
28         Dim FileStream As System.IO.FileStream
29 
30         Try
31             FileStream = New System.IO.FileStream(Path, IO.FileMode.Open)
32         Catch ex As Exception
33             Throw New VBCommandsFactoryException("VBコマンドファイルの読み込みに失敗しました", ex)
34         End Try
35 
36         Dim Reader As New System.IO.StreamReader(FileStream)
37 
38         Try
39             CommandArray = CType(Serializer.Deserialize(Reader), ArrayList)
40         Catch ex As Exception
41             Throw New VBCommandsFactoryException("VBコマンドファイルの逆シリアル化に失敗しました", ex)
42         Finally
43             FileStream.Close()
44         End Try
45 
46         Return CommandArray
47     End Function
48 End Class
49 
50 '例外クラス
51 Public Class VBCommandsFactoryException
52     Inherits Exception
53     Public Sub New(ByVal msg As String)
54         MyBase.New(msg)
55     End Sub
56     Public Sub New(ByVal msg As String, ByVal innerException As Exception)
57         MyBase.New(msg, innerException)
58     End Sub
59 End Class

完成品は、「外部データを使う」ということを意識して、ファクトリーパターンを適用したので、 若干わかりにくくなってしまったかもしれませんが、
「ExportXMLメソッド」がArrayList→XMLで、「ImportXMLメソッド」がXML→ArrayListとなっています。
VBCommandsFactoryExceptionは例外クラスですので、無視してやってください。

数行書くだけで、クラスの中身をファイル化できるのはありがたいことです。
しかも取り込むのも簡単ですし、色々と使えそうですね。

が、
・XMLシリアル化では読取専用プロパティは出力されない

という特徴があるそうです。
もちろん今回は関係ないのですが、覚えておいて損はないでしょう。
また、読取専用プロパティ等に制限されず、すべてをシリアル化するには
・BinaryFormatterクラス
を使用するのだそうです。


蛇足
上記ソースは自作ソフトにて変換したHTMLコードなんですが、空白改行が抜け落ちている・・・
あと、ブログって幅狭いねぇ・・・
何とかしよう・・・

2005/1/27
一部予約語が正しく装飾されないのを修正。
また、空白改行表示を修正。
テーブルタグを使って、行番号を表示。
コピりにくくなった・・・
[ 投稿者:mk3008 at 00:55 | VB.NET | コメント(0) | トラックバック(2) ]

この記事へのコメント

この記事へのトラックバック
シリアル化/逆シリアル化(VB2008バージョン)
最近、よくシリアル化、逆シリアル化をするので、以前に書いたサンプルコードをVB2008用に修正。...
投稿者: VB.NETで作る! at 2010-03-20 00:46:57
シリアル化を使ったクローン
VS2010+...
投稿者: VB.NETで作る! at 2014-02-11 13:44:09

この記事へのトラックバックURL
http://shinshu.fm/MHz/88.44/a02480/0000025896.trackback

この記事の固定URL
http://shinshu.fm/MHz/88.44/archives/0000025896.html

記事へのコメント
 
簡単演算認証: 9 x 7 + 5 =
計算の答えを半角英数字で入力して下さい。
名前: [必須]
URL/Email:
タイトル:
コメント:
※記事・コメントなどの削除要請はこちら