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

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

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

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

Python

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

Q&A

5回答

7423閲覧

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

kento2543

総合スコア163

Ruby

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

Python

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

0グッド

0クリップ

投稿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間でデータの送信することはできないのでしょうか?

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

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

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

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

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

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

投稿2015/09/08 14:40

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2015/09/08 13:09

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

投稿2015/09/08 12:46

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

投稿2015/09/08 21:53

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

投稿2015/09/08 13:20

wakuwaku

総合スコア386

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問