- PR -

C# SoapFormatterでprivateフィールドをシリアライズする方法

投稿者投稿内容
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-11-22 12:58
引用:

一通りタイトルに目を通して、自分の仕事に関係しそうなもの、この先使えそうなもの、純粋に楽しそうなものは、結果を追いかけます。
だって、他の人が、ワタシに代わって苦労して下さっているんですよ?利用させていただかないと、もったいないじゃないですか?!


自分が関係したものは覚えているかもしれませんが、そうでなければ探したって見つからない場合もあるでしょう。何か言うなら「ここで昔書いたよ」ってリンク先でも明示してあげた方が建設的ではないでしょうか? 似たような質問で掲示板を汚すなってことはないですよね。

まぁそれは置いておいて本題を。

引用:

今回の主因は属性が付いていないことでした。掘り返してくださったものを見ると、付けていないとダメ、と書いています。また、こっちを強調したいですが、MSDNライブラリにもそう書かれています。DataSetに放り込んだので、DataSetがリフレクションを使ってシリアライズの真似事をしてくれますが、単独でシリアライズしようとしたら、エラーになるんですよ。連載記事をもとにしていますが、前の回に「付けること」って書いてないですか?
また、その回だけでも、コードを見比べればSerialize属性に気づいてもおかしくないと思います。
このように、ウェブ会議室で質問する前に、やっておけば間違いに気付ける事があると考えます。で、そのほうが早く解決するでしょ?


今回の流れよく読めば分かりますが Inch クラスに Serialize 属性をつけてもダメです。

あるクラスがシリアル化可能であるためには、Serialize 属性があること、そして必要により ISerializable を実装する事です。

Serialize 属性しかついていないクラスは自動シリアル化されます。ただし、自分も含めたオブジェクトグラフが全てシリアル化可能でなければなりません。

ISerializable は厄介で、クラス自身が好きなようにシリアル化のロジックをカスタマイズできます。要するに、クラス自身が必要ないと判断した内部データはシリアル化されませんし、自身が包含しているオブジェクトがシリアル化可能でなくても一向に構いません。

DataSet は ISerializable を実装しているクラスなので、どのような Formatter を使おうと XML 形式でシリアル化してしまいます。そして、Column の型が独自型だった場合は、おそらくリフレクションを使って値を取り出しているので、Column の型が Serialize 化可能かどうかは関係ありません。従って、Serialize 属性がなくてもかまいません。ちなみに、.NET1.x 時代はせいぜい ToString() するだけでした。

従って、通常、SoapFormatter は private フィールドも含めてシリアル化しますが、それは自動シリアル化クラスに限る話で、ISerializable を実装したクラスはシリアル化制御をカスタマイズしているため、その限りではないという事です。

DataSet のシリアル化のロジックを変えることはできないので、回避策は、public にするしかないんじゃないかなと思います。

_________________
囚人のジレンマな日々
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2007-11-22 13:19
ちょっと実際に試してみました。

>本当にバイナリでいいなら、RemotingFormatプロパティをBinaryにして、
>BinaryFormatterを使ったらいけるかもしれません。

と書きましたが、一応これでいけるようです。
まあ実際に使うかはおいとくとして。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-11-22 14:05
引用:

れいさんの書き込み (2007-11-20 22:57) より:

自分で問題に直面するまで見ないのは普通ではないですか?
私もそうでしたし。
回答する気でいる人なら別ですが。

引用:

囚人さんの書き込み (2007-11-22 12:58) より:

自分が関係したものは覚えているかもしれませんが、そうでなければ探したって見つからない場合もあるでしょう。何か言うなら「ここで昔書いたよ」ってリンク先でも明示してあげた方が建設的ではないでしょうか? 似たような質問で掲示板を汚すなってことはないですよね。


ここに関しては疑問にぶつかった時点での過去ログ検索についてのことだと思っていましたが違うのでしょうか。 この会議室へのデビュー時期の話が出ているので行間でそう読めないこともないですが、意図がちょっと良くわからないですね。

Jitta さんの意図はわからないので私は '内容' についてあれこれ言うつもりはありません。 ただ誤解を招くような書き方 (明らかに意図的に見下げていると思わせるような書き方など) をしていないか、回答をする者も気をつけなくては質問者に検索や推敲を求めることは難しいのではないかと思います。 それでも間違いはあると思います。 その時は被った相手に対して謝罪という行動が良いと思うのですよね。 今回その件については Jitta さんは認めているように見えますが、もう一歩欲しいところだなと思います。

納得できない部分はバックグラウンドでやり取りしておいてくれると助かります。 私もおせっかいだとわかりつつも、こんなことを書いている以上はえらそうなことは言えませんけど...

本題の方は囚人さんのおかげで書くことがないほどに勉強になりました。(デビュー日からして私の負けw)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-11-22 22:34
引用:

Jittaさんは自分が平均だと思っているわけではないですよね?


これは嫌味と取られる可能性があり、軽率でした。
引用:

人によっては悪意を持って取る可能性を考えると


と、自分で言ったのに…。

裏にこめられた意味はありません。
ですので
引用:

Jittaさんの書き込み (2007-11-22 07:55) より:
私は自分が平均だとは思っていませんよ。平均まで届いていますか?そんなに評価していただけるとはありがたいです。


褒めたわけでも嫌味をいったわけでもありません。

自分は普通で、自分のできることは他人も出来るはずだという、
謙虚なのか傲慢なのかわからない人もたまにいますので、
そーゆー人ではないでしょっていうただの確認です。

#可能性を全部列挙して潰さないと落ち着かない性分で。

ひろしさんとJittaさんの関係は知りませんので、
もしかしたら非礼を許せる仲なのかもしれませんが、
それでもここは他人が見れる場所です。

他のJittaさんの投稿を見てますので、
人を見下す意図が無く、むしろ親身になり過ぎているのだろうと思いますが、
他人が見たら勘違いしますし、
こういう回答がある場所へ質問するのは嫌だろうなと思います。
それはコミュニティの衰退を生みます。

ですので、私の投稿は「表現が適切で無い」という批判です。
それ以外の意図はありません。

引用:

納得できない部分はバックグラウンドでやり取りしておいてくれると助かります。 私もおせっかいだとわかりつつも、こんなことを書いている以上はえらそうなことは言えませんけど...


Jittaさんには私の意図が伝わっていないようですので、
他の人にも伝わっていない可能性もあります。
邪魔なのはわかりますが、こちらで投稿します。

引用:

その時は被った相手に対して謝罪という行動が良いと思うのですよね。 今回その件については Jitta さんは認めているように見えますが、もう一歩欲しいところだなと思います。


私は批判のつもりであって、非難のつもりはありません。

私は上のような思考過程で、コミュニティの衰退を招く、という理由で
Jittaさんの発言を適切でないと批判しています。
思考過程や論理が間違っているなら批判していただければいいだけですし、
私の言う通りだということになっても、
ひろしさんが嫌な思いをしたから謝れと言ってるわけではないですし、
もちろん私に謝れと言ってる訳でもありません。

私は私の意図がJittaさんや読んでる人に伝わればそれでいいので、
(何か変なことを私が言ってるなら教えて欲しいですが、)
そう考える奴もいるんだと、スルーしてください。

#フレームするのも憧れですが。

念のため。
じゃんぬさんの投稿の引用の二つ目は批判する意図があっての引用ではありません。
ただ話が出たので私の意図が曲解されないよう引用しただけです。
さらに誤解を招く表現になっているかもしれませんが。
問題を起こしたらきちんと謝罪すべきという
じゃんぬさんの意見に反対しているわけではありませんし
じゃんぬさんがJittaさんは謝るべきと思ってると解釈してるわけでもありません。

追記、およびいくつか修正。

[ メッセージ編集済み 編集者: れい 編集日時 2007-11-23 06:38 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-11-23 08:17
引用:

囚人さんの書き込み (2007-11-22 12:58) より:
自分が関係したものは覚えているかもしれませんが、そうでなければ探したって見つからない場合もあるでしょう。


あら?そうですか。。。困ったな。
 じゃぁ、私が特殊なのでしょうか。関係しなくても、興味を持って読んだものは、「書いてあった」ことをかなりしつこく覚えているのですが。その「書いてあった」記憶をもとに検索をかけています。あることがわかっているので、まず見つけ出せる、と。そういうものだと思っていました。困ったな...
 もちろん、興味があって、書かれていることについて追求することは、また別の話です。

引用:

リンク先でも明示してあげた方が建設的ではないでしょうか?


後で見つけたのですが、書いたときには見つけられていませんでした。
 逆に、覚えているから「このキーワードで見つかるはず」と思いこんでいることもありまして。キーワードを換えて検索し直して、見つけました。この点は、申し訳なく思っています。

引用:

今回の流れよく読めば分かりますが Inch クラスに Serialize 属性をつけてもダメです。


はい、そうですね。後で読み直して気がつきました。

 が、私が問題にしたいのはそこではなく、ウェブ会議室で質問する前にもっとすることがあるでしょ?ってことです。

 Serialize 属性がないと、DataSet に放り込んであればシリアル化できますが、放り込んでなければシリアル化できません。単独でシリアル化を試していたなら、Soap シリアル化でプライベート メンバもシリアル化できることが確認できているはずです。また、XML シリアル化と、違う XML ができることも確認できるはずです。このテストがしてあれば、質問も変わったと思いますし、出てきた XML を見比べることで、DataSet が(リフレクションしていることに気がつかなくても)何か特別なことをしていることは気がつけたと思います。
 また、MSDN のシリアル化に関する箇所<microsoft.com>を読んでいれば、ISerializable インターフェイス<microsoft.com>を使用して、シリアル化をカスタマイズする<microsoft.com>ということを試してみようかと思ったかもしれません。

 シリアル化をカスタマイズすることは、難しい部類にはいると思います。しかし、単独でシリアル化ができるか試してみること、MSDN ライブラリを読むことは、そんなに難しいことなのでしょうか。少なくとも、自分は DataSet に放り込むという、記事とは違うことをしているのだから、その点を確認していれば、記事が嘘を書いていると取れるような発言はなかったのではないかと思います。
引用:

ひろしさんの書き込み (2007-11-20 16:22) より:
【質問1】
privateな_mmフィールドはなぜシリアライズされないのでしょうか?
↑この質問はなくなるでしょう

【質問2】
DataSet のシリアル化で、privateなままでシリアライズ対象に含める方法はありますか?

【現象】
下のソースコードを参照願います
・長さ(インチ単位)が含まれているデータセットをシリアライズしています。
・下記サイトに次のような説明があります。

...SoapFormatterクラスは、(何も指定しないデフォルト状態で使うと)すべてのフィールドがシリアライズの対象となる。...
↑「単独ではこうだけど、DataSet からはこうならない。なんで?」みたいな質問になるでしょう

ラフィン
会議室デビュー日: 2007/11/23
投稿数: 5
投稿日時: 2007-11-23 10:40
引用:

Jittaさんの書き込み (2007-11-23 08:17) より:

 が、私が問題にしたいのはそこではなく、ウェブ会議室で質問する前にもっとすることがあるでしょ?ってことです。


 視点を変えれば 、ウェブ会議室で回答する前にももっとすることがあるでしょ?ってことですよね?

引用:

後で見つけたのですが、書いたときには見つけられていませんでした。
 逆に、覚えているから「このキーワードで見つかるはず」と思いこんでいることもありまして。キーワードを換えて検索し直して、見つけました。この点は、申し訳なく思っています。


 覚えている人がきっちり過去ログ検索せずに人のこととやかく言ってはダメですよね?
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-11-24 02:01
じゃんぬねっとさんの「バックグラウンドでやった方が良い」というのはもっともですが、敢えてここで。

引用:

あら?そうですか。。。困ったな。
 じゃぁ、私が特殊なのでしょうか。関係しなくても、興味を持って読んだものは、「書いてあった」ことをかなりしつこく覚えているのですが。その「書いてあった」記憶をもとに検索をかけています。あることがわかっているので、まず見つけ出せる、と。そういうものだと思っていました。困ったな...
 もちろん、興味があって、書かれていることについて追求することは、また別の話です。


誤解を恐れずに言うと、特殊ですね。

会議室デビューの話をしていたので、それを用いますが、皆が皆、会議室デビューしてからずっとこの会議室の投稿を読んでいるわけではないです。私は興味のあるものしか読んでいません。なので「書いてあった事をかなりしつこく覚えている」のは最低でも読んだものだけですし、「あることがわかっている」というのも全ての記事には言えないです。

私が言わなくても、当然ご理解されていると思いますが、「自分がやっている事は他人も当然やっている」という前提はどんな場合でも持つべきではないでしょう。

極端な例を挙げると、Jitta さんが何か質問したときに、常に海外のフォーラムをチェックしている回答者が「どこどこの国のどこどこのフォーラムに過去に同じ質問あったよ。僕は読んだ事あるから Jitta さんも当然読んだよね?検索した?」と言うのと同じように感じました。

引用:

が、私が問題にしたいのはそこではなく、ウェブ会議室で質問する前にもっとすることがあるでしょ?ってことです。



Jitta さんはどう感じたのかわかりませんが、少なくとも私は、ひろしさんが「質問する前にもっとすること」をしたのかどうかの判断がつきません。むしろ、「現状の問題点、望む事がはっきりしている」どちらかと言えば、良い質問のしかただと感じています。

質問する際に出すべき材料が出ている。したい事がはっきりしている。これに応えるのに何の不満があるでしょう。

また、当然ですが、小説や詩などの芸術的文章でない限り、自分の文章の行間が読まれる事はまず期待できません。曲解する人もいます。Jitta さんの最初のレスポンスは、読み手に行間を読む努力をさせているように感じました。



最後に、
引用:

後で見つけたのですが、書いたときには見つけられていませんでした。
 逆に、覚えているから「このキーワードで見つかるはず」と思いこんでいることもありまして。キーワードを換えて検索し直して、見つけました。この点は、申し訳なく思っています。


ご本人が見つけられないものを
引用:

まゆりんさんと2年がかりでここに投稿したのですけど、見ていなかったのね。。。


は、いくらなんでも酷です。その意図はないと思いますが「自分はできないけど、他人はしろ」と受け取られます。
ひろしさんも「書いたときには見つけられていませんでした」だったかもしれません。


[ メッセージ編集済み 編集者: 囚人 編集日時 2007-11-24 02:49 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-11-24 04:10
引用:

れいさんの書き込み (2007-11-22 22:34) より:

私は批判のつもりであって、非難のつもりはありません。
私は上のような思考過程で、コミュニティの衰退を招く、という理由でJittaさんの発言を適切でないと批判しています。
思考過程や論理が間違っているなら批判していただければいいだけですし、


ん? 別に私もれいさんを否定しているわけではないので、そう言われても困ってしまいます。

引用:

私の言う通りだということになっても、ひろしさんが嫌な思いをしたから謝れと言ってるわけではないですし、もちろん私に謝れと言ってる訳でもありません。


え? 誰かが 「そう願っているからそうせよ」 という意味で書いたのではありません。 私個人の願いであり異見です。

何だか会話になっていないような...

引用:

私は私の意図がJittaさんや読んでる人に伝わればそれでいいので、
(何か変なことを私が言ってるなら教えて欲しいですが、)
そう考える奴もいるんだと、スルーしてください。


えーっと、何度もこうだと会話になっていないような気がしてならないのですが... 私の先の投稿にれいさんに批判的な内容が少しでもありましたでしょうか? 最初の 3 行は 「こういう意味なのではないでしょうか」 ということを囚人さんとれいさんに向けて書きました。 しかし残りはすべて内容からしてどう考えても Jitta さんに向けての発言です。

私に至らぬ点があれば謝罪致しますが、私は私で何だか (実際には違いますが) 八つ当たりされたような印象を受けました。

引用:

念のため。
じゃんぬさんの投稿の引用の二つ目は批判する意図があっての引用ではありません。
ただ話が出たので私の意図が曲解されないよう引用しただけです。
さらに誤解を招く表現になっているかもしれませんが。
問題を起こしたらきちんと謝罪すべきという
じゃんぬさんの意見に反対しているわけではありませんし
じゃんぬさんがJittaさんは謝るべきと思ってると解釈してるわけでもありません。


最初に私が見た時にはこの部分は書かれていませんでした。 先日読んだ時はしばらく @IT 会議室には行かないでおこうと思うくらい微妙な気持ちになったものです。 そしてこの文を見た今でも 「引用した意味がわからないので」 疑問を解決したい欲求から微妙な気持ちになっています。

こんなことも書く予定ではなかったのですが、何があるかわからないものですね。

引用:

囚人さんの書き込み (2007-11-24 02:01) より:

じゃんぬねっとさんの「バックグラウンドでやった方が良い」というのはもっともですが、敢えてここで。


それは初期の段階で有効な提案であって、今はもう手遅れの状態でしょうね。 バックグラウンドでとは言いませんが、別スレッドでお願いしたいところです。 そのための会議室だってあるわけですから。

大丈夫だとは思いますが念のため 「囚人さんの意見自体には一切異論はありません」 と書かせて頂きましょう。 理由は不安だからです。

ここからの言動に期待しつつ私はさがるとします。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)