バイナリ シリアル化とは?

このQ&Aのポイント
  • バイナリ シリアル化は、オブジェクトの状態をストレージ メディアに格納するプロセスのことです。
  • オブジェクトのフィールドとクラスの名前がバイトストリームに変換され、データストリームに書き込まれます。
  • バイナリシリアル化は、オブジェクトの完全な複製を作成するプロセスです。
回答を見る
  • ベストアンサー

バイナリ シリアル化とは?

バイナリ シリアル化 シリアル化は、オブジェクトの状態をストレージ メディアに格納するプロセスとして定義することができます。 このプロセスの実行中に、オブジェクトのパブリックおよびプライベートなフィールドとクラス (クラスを格納しているアセンブリを含む) の名前がバイト ストリームに変換され、 データ ストリームに書き込まれます。続いてオブジェクトが逆シリアル化され、 元のオブジェクトの完全な複製が作成されます。 VB.NET 学習58日目の初学者です。 還暦を迎えたデザイナでプログラマではありません。 ですから、この説明が難解で訳がわかりません。 D:\Tem\T1.bin   ・・・・ 」kWindowsApplication23,Version1.0.0.0, Culture=neutral, PublicKeyToken=null|  ->WindowsApplication23.Test1」 |o| _Member1|o| _Member2  [ _] T1.Member1] T2.Member2 と、こういうイメージのバイナリファイルが作成されていりことはわかります。 が、私の理解はここまで。 上記の MSDN ライブラリを私にもわかるように手短に説明していただければ幸いです。

noname#140971
noname#140971

質問者が選んだベストアンサー

  • ベストアンサー
  • nak777r
  • ベストアンサー率36% (49/136)
回答No.1

>こういうイメージのバイナリファイルが作成されていりことはわかります。 訳すと と、こういうイメージのバイナリファイルが作成されますよ って事が書いてあるだけです かなり意訳、なので、だいたいこんな感じだと思っていただければよいかと シリアル     = serial 連続とか連結とかの意味 オブジェクト   = 関数やクラス等の意味 パブリック    = public 公開されている、他のクラスからも参照可能な設定値や現在値 プライベート   = private 公開されていない、他のクラスからは非参照な設定値や現在値 バイトストリーム = 文字列 データストリーム = データの列 シリアル化    = オブジェクトから取得できる情報を連続的に羅列してデータ化したもの 逆シリアル化   = シリアルの情報からオブジェクトを作成する

noname#140971
質問者

お礼

 シリアル(連続・連結)化は、文字列や構造体、クラスとかのオブジェクトをハードディスク等に記録するプロセスとして定義できる。このプロセスの実行中に各々のオブジェクトの参照可能、あるいは参照不能の設定値や現在値は文字列に変換されデータの列として書き込まれる。つまりは、シリアル化とはオブジェクトの情報を連続的に羅列したデータに変換すること。このように特別に連続化されたデータ列は、読み込むプロセスで簡単に元通りに戻せる。 回答を連続した文章に変換すると、こんな感じになりました。 この文章を読み返していたら、「オブジェクトを書き込み、それを元どおりに読み込む操作」ということかなー! そのように思えてきました。 ありがとうございました。

関連するQ&A

  • プログラム超初心者です。

    独学でJavaの勉強をしているんですが、どの本を読んでもクラスとかの意味がよくわかりません。どの本も似たような書き方をするんで・・・。わからないのは次の言葉ですね。 クラス メゾット オブジェクト オブジェクト指向 バイナリデータ ストリーム まず最初のクラスとかの意味がわからないので、そのまま進んでもやっぱりよくわからず・・・。初心者にでもわかりやすく言うとどういう意味なんでしょうか? ちなみに自分はこれまでプログラムの勉強などしたことがありません。

    • ベストアンサー
    • Java
  • ファイルシステムオブジェクト(FSO)について

    ふと疑問に思ったんですけど、 ファイルやディレクトリの一覧の利用(コレクション)には FolderオブジェクトのFilesやSubFoldersを利用するんですけど、 これってFolderクラスを継承したサブクラスになりますか? それともFolderオブジェクトには該当フォルダの全データが格納されていて、 コレクション以下はただ単にFolderオブジェクトの メンバ変数にアクセスしているだけになりますか? 説明では新たにインスタンスを作成しているように感じられないので、 よろしくお願いします。

  • 友人からの問題 プログラム言語です

    友人から出された問題が未だに解けません 次のような基本クラスと派生クラス(クラス階層)を作成 飛行機の情報を格納するクラス階層を作成 まずairshipという基本クラスを作成 airshipクラスには搭乗可能人数と積載貨物可能量を格納(単位はポンド) また搭乗可能人数と積載貨物可能量を表示するメンバ関数を作成 次にairshipからairplaneとballoonという2つの派生クラスを作成 airplaneクラスには推進機構の種類(プロペラまたはジェット)と 航続距離(単位はマイル)を格納 balloonクラスには気球を浮上させる為に使用する気体(水素またはヘリウム)と 最大高度(単位はフィート)を格納 main関数でこのクラス階層を使うプログラムを作成 *airshipとballoonのオブジェクトを作成して、その設定内容を表示する どなたかこの問題を解いていただけませんか? 数ヶ月頭を悩ませていますが友人は答えを教えてくれないので 今回投稿させていただきました、よろしくお願いしたします

  • VC++ 言葉の並び替え

    授業でVC++2013を扱っているのですが、今回、以下のような課題が出題されました。 「アルファベットの順がおかしい英単語を入力して、正しい英単語を表示させよ」 (例) alpep → apple 条件  ・クラスを一つ以上使う  ・静的(static)メンバ関数を使う  ・string class を使ってはならない また、参照とする英単語辞書のようなものはファイルストリームで読み込め、とのことです。 正直、何をどうすればよいのかさっぱりなので、筋道だけでも教えていただきたいです。 なお、授業はC++初心者用なので、あまり複雑なことを使う方法だと私自身さっぱりわからないので、そちらも配慮いただけると幸いです。 取り敢えず、今まで扱ったものとしては繰り返し、条件分岐、配列、ポインタ、オブジェクト、クラスといったところです。

  • バイナリ送信で出るエラーコードの意味が分かりません

    シリアルポートでバイナリを非同期で送信するプログラムを作成しています。 以下のソースで実行すると、「重複したI/O処理を実行しています」というエラーがでました。 何が間違っているのか分りません・・。 どうかご指摘お願いします。 void CMyDlg::OnReset() { //COMポートオープン HANDLE hCom; hCom = CreateFile( "COM4", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL ); //通信設定 DCB dcb; GetCommState(hCom,&dcb); dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(hCom,&dcb); OVERLAPPED old; // オーバーラップ構造体の初期化 ZeroMemory( &old, sizeof(old) ); old.Offset = 0; old.OffsetHigh = 0; old.hEvent = NULL; //データ送信 char wbuf[7] = {0x02,0x00,0x01,0x00,0x31,0x15,0x12}; DWORD wbyte; WriteFile(hCom,wbuf,sizeof(wbuf),&wbyte,&old); //エラーコード取得&文字列に変換&表示 LPVOID lpMessageBuffer; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),//エラーコード取得 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL ); MessageBox((LPCTSTR)lpMessageBuffer); //メッセージボックス LocalFree( lpMessageBuffer ); //COMポートクローズ CloseHandle(hCom); }

  • オーバーロードしたメンバ関数が継承後,利用できない

    オーバーロードしたメンバ関数のクラスを継承後,そのメンバ関数と同名のメンバ関数を定義すると,オーバーロードしたメンバ関数が呼び出せなくなります.何故でしょうか? 質問を一言で正確に表現できてないと思いますので,状況を順を追って説明します. まず,クラスT1にメンバ関数m(int)があったとします. そのメンバ関数をオーバーロードしてm(float)を作ったとします. そして,T1を継承してT2を定義し,その中でメンバ関数m(int)をオーバーライドすると,T2のオブジェクトではm(float)が呼び出せなくなってしまいました. 何故この様なことをするかといいますと,m(string)はstringの引数をある関数で変換して整数にしてから,intでm(int)を呼び出しているとします. T2でも,stringによってm(int)を呼び出すので,T1で定義したm(string)をT2でもそのまま使いたいのです. 例です class T1{ public: virtual void m(int i){cout<<i<<"T1\n";} void m(string s){m((int)s[0]);} }; class T2{ public: virtual void m(int i){cout<<i<<"T2\n";} }; int main(){ T2 t; string s("a"); // t.m(s); /*error*/ t.T1::m(s); } 出力 97T2 T1のm(string)はT2のm(int)を呼び出してます. 何か解決策ありますでしょうか? また,言語の仕様がこの様になってるのは,この様なことをすると問題があるからだと思うのですが,どのような問題が起こるので禁止されてるのでしょう? それとも実は,この様なことはできるのでしょうか? (つまり,単に私のプログラムが間違ってる)

  • クラス

    VB.NET 学習58日目という初学者です。 未だ、Sub Main() でシコシコと基本事項の確認中です。 やっと構造体の演習を昨日から。 案の定、わからないことに遭遇しました。 ' ============================== ' TEST1、TEST2 の BSave、BLoad ' ============================== Module theTEST1   Sub Main()     ' -----------------------     ' TEST1 の BSave、BLoad     ' -----------------------     Dim T1 As New TEST1     T1.Member1 = "T1.Member1"     T1.Member2 = "T1.Member2"     BSave(T1, "D:\Temp\T1.BIN")     T1.Member1 = "AAA"     T1.Member2 = "BBB"     Debug.Print(T1.Member1)     Debug.Print(T1.Member2)     T1 = CType(BLoad("D:\Temp\T3.BIN"), TEST1)     If T1.Member1 <> Nothing Then ' Null エラーが回避できない!       Debug.Print(T1.Member1)       Debug.Print(T1.Member2)     Else       Message("")     End If     ' -----------------------     ' TEST2 の BSave、BLoad     ' -----------------------     Dim T2 As TEST2     T2.Member1 = "T2.Member1"     T2.Member2 = "T2.Member2"     BSave(T2, "D:\Temp\T2.BIN")     T2.Member1 = "AAA"     T2.Member2 = "BBB"     Debug.Print(T2.Member1)     Debug.Print(T2.Member2)     T2 = CType(BLoad("D:\Temp\T3.BIN"), TEST2)     If T2.Member1 <> Nothing Then       Debug.Print(T2.Member1)       Debug.Print(T2.Member2)     Else       Message("")     End If   End Sub End Module Function BLoad(ByVal aPath As String) As Object   If File.Exists(aPath) Then     Try       Using fs As New FileStream(aPath, FileMode.Open, FileAccess.Read)         Dim bf As New BinaryFormatter         Dim aObject As Object = bf.Deserialize(fs)         fs.Close()         Return aObject       End Using     Catch ex As IOException       MsgBox(ex.Message & "(BLoad)", , "エラー:")       Return Nothing     End Try   Else     Return Nothing   End If End Function T1 はクラスライブラリで定義。 T2 は構造体。 構造体の場合は、Nothing でチェックできました。 しかし、クラスライブラリの場合はチェックできません。 このエラーの考え方と処し方を教えてください。 構造体とクラスライブラリは表向きは同じようなもの。 ですから、どちらにも通用する BSave、BLoad 関数を作成使用としたわけです。 宜しくお願いします。

  • JAVAプログラミング、Stringからの画像ファイル作成について

    Ping画像ファイルの元のバイナリデータがString変数に格納されています。 この状態でping画像ファイルとして保存、もしくはswingで表示したいのですが、どのようにすればよろしいですか?? 以下具体的なイメージ。 String imagedata=new String("臼NG IHDR炳?カ MtュコDuシQS僥ト q#G? o<Lwマヘ[版MrュコDナ[5?! H 屆 3.ユh偃槿wz?夥Zu?ィゥL? ハ2モ 」帝......END?"); ここからimagedataをpingファイルとして出力、もしくはswingで表示。 pingバイナリデータを扱うクラス等があるのでしょうか。 よろしくお願いします。

  • 帽子紛失事件

    Tさんには2人の友人がいました。 OくんとSさんです。 その2人は、運動会のリレーのメンバーに選ばれており、 連日グラウンドで練習していました。 ある日のこと。 授業が終わるとすぐに、OくんとSさんは いつものようにグラウンドへ向かいました。 Tさんは特に用事もなかったので、トイレへ行った後、 荷物を持たずに2人のいるグラウンドへ様子を見に行きました。 練習は概ね好調だったようです。 練習を終えた後、3人分の荷物を取りに行くため、Oくんが教室へ戻ると、 クラスメイトの3人(Hくん、Gくん、Kくん)が話をしていました。 Oくんが「帰らないの?」とたずねると、3人は返事もせずそそくさと 教室を出て行きました。 Oくんは特に気にとめず、荷物を持って行こうとしましたが、 Tさんの愛用していた帽子だけが、教室のどこにも無くなっていました。 OくんがTさんにこの事を告げると、 「授業が終わって、教室を出るまでは確かにあった」と言います。 翌日、例の3人(Hくん、Gくん、Kくん)に聞いてみましたが 知らぬ存ぜぬの一点張り。 Tさん達が教室を空けたのは、 授業終了直後の14時45分から、 Oくんが教室へ戻る16時30分までの間。 状況的にクラスメイトだけでなく他の学年・クラスの人でも犯行可。 1階で窓も開いていたため、窓からの侵入者の可能性も捨て切れません。 この事件、今後どのように捜査したら良いでしょうか?

  • VB.Net: クラスの共有メソッドの作り方?

    あと3日でVB.Net学習2ヶ月目という初学者です。 Sub Main() のみで基本事項の確認のみをしてきました。 ですから、フォーム、レポート、データベース、WEB関連の知識は完全にゼロ。 さて、その基本演習も最終段階に突入。 いよいよクラスです。 ' ============================== ' クラスプログラミング; 演習3 ' ============================== Module theClass   Sub Main()     Dim T1 As New TEST1     T1.Member1 = "T1.Member1"     T1.Member2 = "T1.Member2"     T1.BSave("D:\Temp\T1.bin", DirectCast(T1, Object)) <--- ?1     T1.Member1 = "AAA"     T1.Member2 = "BBB"     Debug.Print(T1.Member1)     Debug.Print(T1.Member2)     T1.BLoad("D:\Temp\T1.bin", T1) <--- ?2     If T1 IsNot Nothing Then       Debug.Print(T1.Member1)       Debug.Print(T1.Member2)     Else       Message("T1.bin は読み込めませんでした。")     End If   End Sub End Module ?1=インスタンスを経由する共有メンバ、・・・へのアクセスです。正規の式は評価されません。 ?2=Option strict on では、'ByRef' パラメータのオブジェクトの値を・・・縮小変換できませんでした。 Public Shared Sub BSave(ByVal aPath As String, ByVal aObject As Object)   Try     Using fs As New FileStream(aPath, FileMode.Create, FileAccess.Write)       Dim bf As New BinaryFormatter       bf.Serialize(fs, aObject)       fs.Close()     End Using   Catch ex As IOException     MsgBox(ex.Message & "(BSave)", MsgBoxStyle.Exclamation, "エラー:")   End Try End Sub Public Sub BLoad(ByVal aPath As String, ByRef aObject As Object)   If File.Exists(aPath) Then     Try       Using fs As New FileStream(aPath, FileMode.Open, FileAccess.Read)         Dim bf As New BinaryFormatter         aObject = bf.Deserialize(fs)         fs.Close()       End Using     Catch ex As IOException       MsgBox(ex.Message & "(BLoad)", MsgBoxStyle.Exclamation, "エラー:")     End Try   End If End Sub 非共有の BSaveメソッドとBLoadメソッドのパラメータはファイルパスだけ。 共有メソッドの場合は、「何を」というのが必要かと思って2つ目のパラメータを追加。 もって、構造体の BSave と BLoad とに援用するテストをしたいと思っています。 し、しかし、上述の2つのエラーを前にどうしてよいか皆目わかりません。 >そのエラーを回避、もしくは発生させないためには次のように改造したらよい! そういう回答等をお願いします。

専門家に質問してみよう