質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.36%

  • Python

    13380questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Ruby

    10211questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

シリアライズってPC間でデータを送るときには必ず必要なのでしょうか?

受付中

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 2,906

cDm_48

score 170


PC間でデータの送信をするときに
・json
・pickle
などでシリアライズしたデータを送るかと思います。


import pickle

data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()

しかし、こういったデータというのはシリアライズせずにPC間でデータの送信することはできないのでしょうか?

シリアライズしないと文字化けしたりするのでしょうか?

初歩的な質問で恐縮ですが宜しくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+2

構造を持ったオブジェクトの内部には、他のオブジェクトへのポインタが入ってたりします。実際に入っているのはメモリアドレスじゃなくてオブジェクトIDだと思いますが。
オブジェクトIDはRubyだとFixnumのようなものは数値が決まればオブジェクトIDも決まりますが、一般のオブジェクトは、どんなオブジェクトIDになるかは実行してみないと分かりません。別の言い方をすると"ABC"のオブジェクトIDは実行する毎に変わります。メモリアドレスが入っている場合でもそれは実行毎に変わりますよね。

ということで、構造を持ったオブジェクトを他のPCあるいは、同じPC内の他のプロセスとやりとりする場合は、そういうメモリ上の内部表現でない形式に変換する必要があります。また、関連するオブジェクトをメモリ上のあちこちから集めてきて順番に並べます。これ(変換と並べ)がシリアライズです。

同じバージョンのRubyプログラム同士だと、Marshal(=記録係)というバイナリを使った効率の良い形式があります。
文字で表現された、言語から独立した形式がJSON等ですね。ただJSONだと言語独立のため、言語独自のオブジェクトを表せませんが。

構造を持たないオブジェクト(単独の数値とか)やごく簡単な構造のオブジェクトだとメモリイメージそのままやりとりしても大丈夫なケースもあります。最初からシリアライズされているというか。

Rubyの例を出しましたが、Pythonでも同様だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

データの伝送という目的だけであれば、シリアライズは必須ではありません。
ファイルに保存したり、あるいは電文という形で、ある一定のフォーマットに従ってデータをまとめれば送ることができます。
(ネットワーク上を流れるIPパケットも、シリアライズせずにデータを伝送している例の一つです。)

しかし、オブジェクトデータだけでなく、特定のデータ構造メソッドを合わせ持つ)を伝送する場合には、伝送後に元のオブジェクトに復元する必要があります。
その場合、《シリアライズ・デシリアライズ》というプロセスを経ることで、確実かつ簡単に伝送することができます。
こちら の説明はJavaの例ですが、シリアライズというのがどういうことなのかイメージしやすいと思います。

異なるPC間の場合だけでなく、同じサーバー上でも異なるプロセス間でオブジェクトを受け渡す場合には、よくシリアライズという方法が使用されているようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

ネットワーク経由でデータを送受信する場合に限っていうと、最終的にはバイト列に変換する必要があるので、どのレイヤーでシリアライズ/デシリアライズが行われるかの違いでしかありません。

シリアライズ可能な形式のオブジェクト(Javaで言うと、Serializableインターフェイスを実装しているクラス)であれば、API側でシリアライズをやってくれるようにすることもできるので、オブジェクトをシリアライズしてから渡さなくても良いように作ることはできます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

JSONやpickelでデータを表現せずに、ということでしたら可能です。
JSONやpickleはデータをどのように表現するかという決まりごと(プロトコル)です。
独自のプロトコルを定義し、その決まりに従って通信電文を作成すれば良いのです。

大事なのはどのような順番で、どのようなフォーマットでデータを表現するかです。


文字化けについては多くの場合、エンコードの違い もしくは環境依存文字の使用が原因となります。
これはどんなプロトコルを使用しても化けるときは化けます。
JSONだからとか独自プロトコルだからというのはあまり関係ないでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

同一のCPU, プログラミング言語をつかっているマシン同士で、データ中のポインター情報などを含んでいなければ、バイナリー形式そのものを転送しても動作するでしょう。
しかし、バイナリーレベルで2つのPCでデータのバイナリー形式が一致しない場合は、データを別形式にして転送することが必要になります。(例えば bigendian, littleendianの差、文字コード体系の差などを吸収する)

Ruby 専用の分散オブジェクトシステムとして druby があります。
内部では、データをシリアライズ、デシリアライズしています。
- library drb http://docs.ruby-lang.org/ja/2.1.0/library/drb.html
...
リモートメソッド呼び出しの引数や返り値には任意の Ruby オブジェクト が使えます。デフォルトではオブジェクトをマーシャリングして 渡され、受け取った側が元のオブジェクトに戻します。つまり オブジェクトはコピーされます。これは通常の同一プロセス上での メソッド呼び出しと大きく異なる点です(通常のメソッド呼び出しでは オブジェクトへのリファレンスが渡されます)。
...

このページを説明を読むと、ruby 同士でデータをシリアライズするにもいろいろなケースを検討するのが必要なのだということを伺い知ることができると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    13380questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Ruby

    10211questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。