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

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

新規登録して質問してみよう
ただいま回答率
86.12%
Ruby

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

Python

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

受付中

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

kento2543
kento2543

総合スコア163

Ruby

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

Python

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

5回答

0グッド

0クリップ

6402閲覧

投稿2015/09/08 10:49

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ページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

回答5

2

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

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

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

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

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

投稿2015/09/08 14:40

otn

総合スコア80385

rifuch, argius👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

1

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

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

投稿2015/09/08 13:09

argius

総合スコア9382

eripong👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

1

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

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

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

投稿2015/09/08 12:46

pi-chan

総合スコア5934

BlueMoon👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

0

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

Ruby 専用の分散オブジェクトシステムとして druby があります。
内部では、データをシリアライズ、デシリアライズしています。

...
リモートメソッド呼び出しの引数や返り値には任意の Ruby オブジェクト が使えます。デフォルトではオブジェクトをマーシャリングして 渡され、受け取った側が元のオブジェクトに戻します。つまり オブジェクトはコピーされます。これは通常の同一プロセス上での メソッド呼び出しと大きく異なる点です(通常のメソッド呼び出しでは オブジェクトへのリファレンスが渡されます)。
...

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

投稿2015/09/08 21:53

katoy

総合スコア22294

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

0

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

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

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

投稿2015/09/08 13:20

wakuwaku

総合スコア386

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

Ruby

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

Python

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