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

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

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

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

48230閲覧

シリアライズやSerializeFieldの意味や使い方がわからない。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

12グッド

4クリップ

投稿2016/11/16 05:37

###前提・実現したいこと

表題の通り、シリアライズやSerializeFieldの意味や使い方がわかりません。
フィールドにSerializeFieldを付けると、publicを付けた時と同じように、
そのフィールドがインスペクタに表示されるようになるということはわかっています。
SerializeFieldはpublicと同じなのでしょうか?

###試したこと

マニュアルを見た。
「Unityがprivateフィールドを強制的にシリアライズします。」と書かれているが、
シリアライズするという意味がわからない。

・シリアライズに関しても検索したが、よくわからない。
例えば、このサイトでは、以下のように書かれていた。

シリアライズとは、複数の並列データを直列化して送信することである。
具体的には、メモリ上に存在する情報を、ファイルとして保存したり、
ネットワークで送受信したりできるように変換することである。
他方、既にファイルとして存在しているデータや、
一旦シリアライズされたデータがネットワークから送られてきた際に、
プログラムで扱えるようにする作業をデシリアライズと呼ぶ。

「メモリ上に存在する情報を、ファイルとして保存したり、ネットワークで送受信したりできるように変換すること」と、
下記のように書くことがどう繋がるのかわからない。

C#

1[SerializeField] 2private int i = 1;

質問①
シリアライズやSerializeFieldの意味を教えてください。

質問②
下記のようなpublicとSerializeFieldの違いは何ですか?
(どちらも書くことによってインスペクタにフィールドが表示されることは認識しています。)

C#

1[SerializeField] 2private int i = 10;

C#

1public int i = 10;

質問③
SerializeFieldの具体的な使い方を教えてください。
コード例などで教えていただけたら助かります。

ご教授のほど、宜しくお願い致します。

tokiwokakeru, usamino, YAGI__, KS-_-SK, Qoo, massu2357, gitalin, mukoda, rikutons, asdfghjk, 他2名👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問①
C#のクラスってそのままファイルに保存できませんよね?
ファイル保存は基本stringかbyte[]の形にしないとできません。(テキストかバイナリ)
それをファイルに保存できる形に変換するのがシリアライズだと思ってください。
(ファイル保存は例です。ファイル保存だけでなくデータのやりとり全般が対象です)

SerializeFieldはシリアライズとは別物だと思ってしまうと楽です。
内部的にはそういった話がからんできますが、
privateフィールドをインスペクタに表示する際に付けるおまじないと覚えておけば十分です。

質問②
インスペクタ上から見たら同じです。ですが、プログラムとしては別物です。
本来のC#と同じでprivateはSerializeFieldを付けても外部のクラスからアクセスすることはできません。

質問③
質問①と同じで、繰り返しになりますが、
privateフィールドをインスペクタに表示する際に付けるおまじないと覚えておけば十分です。

投稿2016/11/16 06:01

編集2016/11/16 06:03
ishi9

総合スコア1294

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

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

退会済みユーザー

退会済みユーザー

2016/11/16 11:39 編集

ご回答ありがとうございます。 質問①のご回答に関して、質問させてください。 「C#のクラスをそのままファイルに保存できない」というのは、 C#のクラスをオブジェクトとしてそのままファイルに保存できないという意味ですか? また、 >ファイル保存は基本stringかbyte[]の形にしないとできません。(テキストかバイナリ) >それをファイルに保存できる形に変換するのがシリアライズだと思ってください。 これに関して検索してみましたが、 例えば、クラスオブジェクトをテキストの形にする場合は、XmlSerializerクラスのSerializeメソッドを使ってオブジェクトをXMLシリアル化する。 http://dobon.net/vb/dotnet/file/xmlserializer.html クラスオブジェクトをバイナリの形にする場合は、BinaryFormatterクラスを使ってオブジェクトをシリアル化する。 http://dobon.net/vb/dotnet/file/binaryformatter.html これらのようにXMLシリアル化やシリアル化することを「シリアライズする」という意味で認識して大丈夫ですか?
ishi9

2016/11/17 01:25

いろいろ言葉足らずですいません。概ね仰る通りの解釈で合っていると思います。 一応、蛇足としてはシリアライズの方法はいろいろあってテキストならjson形式にシリアライズする方法もあります。個人的にはjsonの方がデータ構造がシンプルで容量も小さいので好きです。(unityなら標準機能にJsonUtilityというのがあります) 逆にファイル(データ)からクラス(等の決められたデータ構造)に戻すのをデシリアライズと呼び、この2つの機能を使うと簡単に設定やプレイデータを読み書き(またはデータ通信等)することができます。 シンプルにまとめると、 実用的な意味では「クラス←→テキスト(バイナリ)」に変換するという意味で用いるのがほとんどという認識で問題無いです。
退会済みユーザー

退会済みユーザー

2016/11/17 14:51

ご回答ありがとうございます。 json形式にシリアライズする方法があるということ、勉強になりました。 また、今回、表面的にはSerializeFieldはシリアライズとは別物という考え方でスッキリしました。 SerializeFieldはprivateフィールドをインスペクタに表示する際に付けるおまじないということで、イメージできるようになりました。 ご丁寧にご教授くださりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問