- - PR -
VB.NETでEncoding.ASCIIした文字をシリアル化するとエラーになる
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-01-18 10:31
どなたか知っていたら教えて下さい。VB.NETでExifの情報を読み出しシリアル化したいのですがEncoding.ASCII.GetStringで取り出した文字列をシリアル化すると書き込み後、読み出しエラーになります。調査するとEncoding後の文字列をデバッガ見ると「"SONY」になってました。「"SONY"」であれば問題ないと思いますが、回避策知っていたら教えて下さい。
| ||||||||
|
投稿日時: 2005-01-18 13:37
諸農です。
どのようにシリアル化しているのかの情報を 具体的な内容でアップすることは可能ですか。 _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||
|
投稿日時: 2005-01-18 14:00
早速のお便りありがとうございます。
シリアル化については、Exifの内容を構造体のClass(PicClass)を作成し、そこに下記のように記述しました。シリアル化ファイル名(FileMame)、構造体実態(PicRW)です。 <クラスの定義> Public Class PicClass Structure PicStruct Public MKname As string Public Kisyu As string Public RokouTM As Long ・ ・ End Structure Public Pic1 As PicStruct End Class Public PicRW As New PicClass() <シリアル化> Dim serial1 As New System.Xml.Serialization.XmlSerializer(GetType(PicClass)) Dim fs1 As New IO.FileStream(FileMame, IO.FileMode.Create) serial1.Serialize(fs1, PicRW) fs1.Close() これでわかりますか?宜しくお願いします。 | ||||||||
|
投稿日時: 2005-01-18 21:26
どこでエンコードしているの?
ASCIIエンコードしなければエラーにならないの? XMLシリアル化であれば、テキストエディタで読めると思います。「"SONY」という値を「"SONY"」に修正して読み込ませれば、本当にデシリアライズできますか? それと、エンコードとシリアライズのどちらに問題があると思いますか?そして、その判断の根拠は? もしくは、「"SONY」というのはエンコードした後の値ですか?それともエンコードしてシリアライズした値ですか?どちらにしても、エンコード前の値はどうなっていますか? つまり、原因の追及が甘いっていうこと。 _________________ | ||||||||
|
投稿日時: 2005-01-18 23:53
諸農です。
既にJittaさんからRESがありますが。
1.Exifの内容を読み取る 2.PicClassクラス(構造体?)のインスタンスを生成する 3.読み取ったExifの内容をPicClassオブジェクトのフィールドにセットする 4.XmlSerializerを生成する 5.ファイルストリームを生成する 6.PicClassオブジェクトをシリアライズする 7.ファイルストリームを閉じる どこで、どのようなエラーになるのですか?
「"SONY」ではなく「"SONY"」であればOKというのは何故でしょうか? 実際に試された結果でしょうか? もう少し具体的な内容をアップしてください。 _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||
|
投稿日時: 2005-01-19 09:33
いろいろお世話かけます。処理の順序は以下の通りです。
1.PicClassクラス(構造体?)のインスタンスを生成する 2.Exifの内容(例:メーカ名)を読み取る。処理内容は下記の通りです。 Dim PicBitmap As Bitmap = New Bitmap(例:c:\abc.jpg) Dim PrptyIDList() As Integer = PicBitmap.PropertyIdList() 'プロパティIDリストGET Dim PI1 As System.Drawing.Imaging.PropertyItem 'メーカー名取得 Dim MKnameIdx As Integer = Array.IndexOf(PrptyIDList, &H10F) 'H10Fは、メーカ名のタグ PI1 = PicBitmap.PropertyItems(MKnameIdx) PicRW.MKname = Encoding.ASCII.GetString(PI1.Value) <ここで「"SONY」を取得します> 3.読み取ったExifの内容をPicClassオブジェクトのフィールドにセットする 4.XmlSerializerを生成する 5.ファイルストリームを生成する 6.PicClassオブジェクトをシリアライズする 7.ファイルストリームを閉じる 8.書き込まれたxmlファイルを読み出すとエラーになります。 「プロシジャー呼び出しまたは引数が有効でありません」 「"SONY」取得場所でエンコードせずに「"SONY"」と直接書くとOKです。 問題としては、エンコードしたときに「"SONY"」となるように出来れば良いと思います。 その方法(変換方法?)が分かりません。 宜しくお願いします。 | ||||||||
|
投稿日時: 2005-01-19 11:08
諸農です。
もう少しポイントを絞りましょう。
まず「読み出す」行為はアプリケーションコードで実現しようとしているのですか? であれば、そこが問題点ですよね。 次に、ファイルを閉じてからデシリアライズしようとしているのですか? 「直接書く」と言う行為は何を意味していますか?手作業ですか?コードですか?
本当に「"」が付くだけでOKなのですか? Exifファイルの仕様としてそうなっているのですか? 他のメーカの画像ファイルを読み込んだときに別の問題が出てきませんか? VB.NETの文字列操作として、「"」付けるぐらいなら、文字列の 連結処理を記述するだけで、すぐにでも実現可能ですよね。 取得した文字列の最後が「"」出終わっているかどうかを判定して、 「"」で終わっていなければ「&」とか「+」で追加できますよね? でも、本当にそういった問題でしょうか? _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||
|
投稿日時: 2005-01-19 21:14
PicRW.MKname = """SONY" とするとNG? PicRW.MKname = """SONY""" とするとOK? # PicRW.MKname = "SONY" としたんじゃないですよね? そういう問題じゃないと思う。メーカー名に「"SONY」、バイナリ配列で「22,53,4f,4e,59」と入っているなら、asciiコードからUnicodeにエンコードして「"SONY」という結果が得られるのは当然です。バイナリ配列に「22,53,4f,4e,59,22」と入っているのに「"SONY」としか返ってこないのなら、エンコードの問題です。 エンコード前の値はどうなっていますか?デバッガでPI1.Valueをクイックウォッチしてください。また、エンコード前の値も「"SONY」なら、ファイルの中身はどうなっていますか?JPEGファイルをバイナリエディタで開いて確認してください。 それはそれで1つの問題として、もうひとつ問題があると思う。シリアライズするのはPicClassクラスですよね。これ、値が["SONY]だろうが["SONY"]だろうが、unicode文字列が入っているはずですよね。それのデシリアライズが出来ないというのは、わからない。シリアライズして出来たXMLファイルを直接(unicodeが読み込めるエディタ、例えばメモ帳で)開いて、メーカー名の辺りはどうなっていますか?また、例外が発生する場所と、発生する例外の種類はなんでしょう? _________________ |