- PR -

VB.NETでEncoding.ASCIIした文字をシリアル化するとエラーになる

投稿者投稿内容
MASAI
会議室デビュー日: 2005/01/18
投稿数: 6
投稿日時: 2005-01-18 10:31
どなたか知っていたら教えて下さい。VB.NETでExifの情報を読み出しシリアル化したいのですがEncoding.ASCII.GetStringで取り出した文字列をシリアル化すると書き込み後、読み出しエラーになります。調査するとEncoding後の文字列をデバッガ見ると「"SONY」になってました。「"SONY"」であれば問題ないと思いますが、回避策知っていたら教えて下さい。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-01-18 13:37
諸農です。

どのようにシリアル化しているのかの情報を
具体的な内容でアップすることは可能ですか。


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
MASAI
会議室デビュー日: 2005/01/18
投稿数: 6
投稿日時: 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()
これでわかりますか?宜しくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-01-18 21:26
 どこでエンコードしているの?
 ASCIIエンコードしなければエラーにならないの?
 XMLシリアル化であれば、テキストエディタで読めると思います。「"SONY」という値を「"SONY"」に修正して読み込ませれば、本当にデシリアライズできますか?

 それと、エンコードとシリアライズのどちらに問題があると思いますか?そして、その判断の根拠は?
 もしくは、「"SONY」というのはエンコードした後の値ですか?それともエンコードしてシリアライズした値ですか?どちらにしても、エンコード前の値はどうなっていますか?

 つまり、原因の追及が甘いっていうこと。

_________________
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-01-18 23:53
諸農です。

既にJittaさんからRESがありますが。

引用:

シリアル化については、Exifの内容を構造体のClass(PicClass)を作成し、そこに下記の



1.Exifの内容を読み取る
2.PicClassクラス(構造体?)のインスタンスを生成する
3.読み取ったExifの内容をPicClassオブジェクトのフィールドにセットする
4.XmlSerializerを生成する
5.ファイルストリームを生成する
6.PicClassオブジェクトをシリアライズする
7.ファイルストリームを閉じる

どこで、どのようなエラーになるのですか?

引用:

調査するとEncoding後の文字列をデバッガ見ると「"SONY」になってました。
「"SONY"」であれば問題ないと思いますが、



「"SONY」ではなく「"SONY"」であればOKというのは何故でしょうか?
実際に試された結果でしょうか?

もう少し具体的な内容をアップしてください。


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
MASAI
会議室デビュー日: 2005/01/18
投稿数: 6
投稿日時: 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"」となるように出来れば良いと思います。
その方法(変換方法?)が分かりません。
宜しくお願いします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-01-19 11:08
諸農です。

もう少しポイントを絞りましょう。

引用:

7.ファイルストリームを閉じる
8.書き込まれたxmlファイルを読み出すとエラーになります。
  「プロシジャー呼び出しまたは引数が有効でありません」
  「"SONY」取得場所でエンコードせずに「"SONY"」と直接書くとOKです。



まず「読み出す」行為はアプリケーションコードで実現しようとしているのですか?
であれば、そこが問題点ですよね。
次に、ファイルを閉じてからデシリアライズしようとしているのですか?
「直接書く」と言う行為は何を意味していますか?手作業ですか?コードですか?

引用:

問題としては、エンコードしたときに「"SONY"」となるように出来れば良いと思います。
その方法(変換方法?)が分かりません。



本当に「"」が付くだけでOKなのですか?
Exifファイルの仕様としてそうなっているのですか?
他のメーカの画像ファイルを読み込んだときに別の問題が出てきませんか?


VB.NETの文字列操作として、「"」付けるぐらいなら、文字列の
連結処理を記述するだけで、すぐにでも実現可能ですよね。
取得した文字列の最後が「"」出終わっているかどうかを判定して、
「"」で終わっていなければ「&」とか「+」で追加できますよね?

でも、本当にそういった問題でしょうか?




_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-01-19 21:14
引用:

MASAIさんの書き込み(2005-01-19 09:33)より:

  「"SONY」取得場所でエンコードせずに「"SONY"」と直接書くとOKです。
問題としては、エンコードしたときに「"SONY"」となるように出来れば良いと思います。
その方法(変換方法?)が分かりません。


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が読み込めるエディタ、例えばメモ帳で)開いて、メーカー名の辺りはどうなっていますか?また、例外が発生する場所と、発生する例外の種類はなんでしょう?

_________________

スキルアップ/キャリアアップ(JOB@IT)