- 1 名前:デフォルトの名無しさん mailto:sage [2012/09/06(木) 23:11:33.73 ]
- 前スレ
C#, C♯, C#相談室 Part74 toro.2ch.net/test/read.cgi/tech/1342241550/ Visual Studio 2010 Express www.microsoft.com/japan/msdn/vstudio/express/default.aspx Visual Studio 2012 Express www.microsoft.com/visualstudio/11/ja-jp/products/express
- 112 名前:デフォルトの名無しさん mailto:sage [2012/09/10(月) 22:27:01.02 ]
- >>110
前提 ・foreachの仕様はダックタイピング的であるといわれる。なぜか。 ・上に関連して、List<T>.Enumeratorがなぜpublic structなのか説明せよ ・.NETにおけるジェネリックの特殊化とはどういうものか説明せよ これらに回答できるようになって出直してきなさい
- 113 名前:デフォルトの名無しさん mailto:sage [2012/09/10(月) 22:28:27.25 ]
- ボクシングなんかしたら怪我しちゃうだろ
- 114 名前:デフォルトの名無しさん mailto:sage [2012/09/10(月) 22:36:08.19 ]
- おいおっさん
- 115 名前:デフォルトの名無しさん mailto:sage [2012/09/10(月) 22:37:10.04 ]
- 以下のように、ある任意(IXmlSerializableを実装していないPOCO的な)のオブジェクトをXDocumentを利用してシリアライズ/デシリアライズをしようと思っています。
対象のクラス class Foo { int PropInt { get; set; } Bar PropBar { get; set; } } class Bar { string PropString { get; set; } } 期待するXML <Foo> <PropInt>0</PropInt> <PropBar> <PropString>0</PropString> </PropBar> </Foo> 現在はFooクラスからPropertyInfoを取得し、PropertyInfo.NameとPropertyInfo.GetValue(foo, null)からXElementを生成しています。 プロパティがstringやintなどの基本的な型であれば問題なくできるのですが型が複合型の場合は以下のようにその複合型の名前が値として出力されます。 <PropBar>Bar</PropBar> 理由は理解できるので複合型の場合は再帰的にXElementを生成したいのですが、どのようにしたらよいかわかりません。 XEelementがシリアライズ可能なプロパティ(intやstring等)かどうかを判断する方法があれば、再帰処理が可能かと思いますが判断する方法が見つかりません。
- 116 名前:101 mailto:sage [2012/09/10(月) 22:37:50.49 ]
- >>111 の最後でアホなことを聞いてしまいました。
すいません。 >>102, >>104, >>106, >>108, >>109 お陰様で、理解できました。 ありがとうございます。
- 117 名前:デフォルトの名無しさん mailto:sage [2012/09/10(月) 22:38:20.13 ]
- >>112
それが答えられるようになるとすごいの?
- 118 名前:デフォルトの名無しさん mailto:sage [2012/09/10(月) 22:43:27.04 ]
- >>115
どこまで汎用性持たせるかって話になるけど。 例えば、XElementからのキャスト演算子オーバーロードが定義されてるかどうかで判断するとか。
- 119 名前:デフォルトの名無しさん mailto:sage [2012/09/10(月) 22:50:39.25 ]
- 文字列との相互変換をTypeConverter.ConvertToString/ConvertFromStringに任せるなら
TypeConverter.CanConvertTo/CanConvertFromとか
- 120 名前:デフォルトの名無しさん mailto:sage [2012/09/10(月) 22:53:50.68 ]
- >>115だったらXmlSerializerで一発でしょ
IXmlSerializable不要 いちいちPropertyInfoとか型判定とかやってたらクソ遅いよ
- 121 名前:デフォルトの名無しさん mailto:sage [2012/09/10(月) 23:03:23.07 ]
- つ
static XElement Serialize(object obj) { var serializer = new XmlSerializer(typeof(Foo)); using (var writer = new StringWriter()) { serializer.Serialize(writer, obj); return XElement.Parse(writer.ToString()); } } 自前でこれを超えるものを作るのは相当大変だよ 汎用性は比べ物にならないし速度も普通にやってたら全く勝ち目無い
- 122 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 00:07:15.37 ]
- 今現在はみなさんがおっしゃる通りXmlSerializerを使用しています。
今後の追加の要件として、プロパティ毎に保存するファイルを振り分けたいと考えていて、 プロパティにパスを指定できる属性を付与しました。 その為、XmlSerializerを使うことができなくなってしまったのです。 シリアライズ/デシアライズはそれぞれ1回しか処理が走らないため 多少の速度は目を瞑ることができます。 また、ほかに解決案があれば他の方法でも構わなく、XElementに拘っているわけではありません。 他に思いつかなかったのです。 >>118 オーバーロードの情報はどのようにして取得するのでしょうか。 型情報まで取得できますでしょうか。
- 123 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 00:10:23.73 ]
- >>121でいったんXElementにしてしまえば
後はどうにでもできるだろ
- 124 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 00:14:04.27 ]
- XElementにしてしまえばあとはLINQ to XMLで保存先パスの属性を検索して
振り分けて保存するなんて楽勝ですよ
- 125 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 00:47:13.13 ]
- 確かにその通りでした。
シリアライズはXmlSerializeを使ってそこからXElementに落とし込めばよいのですね。 こういうのが思いつかないのがとても悔しいというか悲しい。 ちなみに>>124さんのいう「LINQ to XMLで保存先パスの属性を検索」 というのはプロパティはLINQで検索して属性はTypeから取得する、でよいでしょうか。 それともLINQ to XMLで一緒にとってこれるのでしょうか。
- 126 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 00:56:18.80 ]
- もうひとつ質問させてください。
Visual StudioのスニペットのXMLのように改行やスペースの入ったタグを利用したいと考えた場合、 どのようにしてシリアライズしたらよいでしょうか。 スニペットのようにXMLにそのまま改行を表現できるものであればそのままシリアライズしたいと考えています。
- 127 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 01:08:26.48 ]
- 改行コード書けばいいだけだろうが!
- 128 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 01:11:30.58 ]
- 自分がやったときは、改行とスペースがなぜか消えてしまったので仕様かと思いました。
明日、出社したら再度試してみます。 すいません。
- 129 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 01:13:25.23 ]
- 改行入った文字列をシリアライズすればいいだけじゃん
- 130 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 01:42:34.16 ]
- オブジェクト(or型)ごとにパス持たせて振り分けるならわかるが
プロパティごとってどうやるつもりなんだ? 素直にやったらどのオブジェクトのプロパティかわからなくなるだろ
- 131 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 01:44:43.14 ]
- 言っている意味がさっぱりわからん
public string hoge{get;set;} これに改行した文字列入れればいいじゃんってことなんだけど プロパティ名で管理されてるじゃん
- 132 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 07:57:59.53 ]
- 片山さつき「修学旅行の行き先を韓国に選ぶ学校ですが、土下座旅行に近い事が判明しました」
engawa.2ch.net/test/read.cgi/poverty/1347252281/ 片山氏が調査を進めると、韓国への修学旅行での訪問先に、信じがたい場所が選ばれていることが分かった。 日本海側の私立高校K(男女共学)が、今月末に予定していた韓国修養会(修学旅行)のレジュメによると、 訪問先に「戦争と女性の人権博物館」や「ナヌムの家/日本軍『慰安婦』歴史館」とあり、 説明に「日本軍性奴隷(日本軍慰安婦)とされた人々の苦悩の深さと日本軍の扱いの実態を知ることができる」 と書かれていたのである。 片山氏は「これはひどい。日本政府が発見した資料からは(慰安婦に)軍や官憲の強制連行を示す 証拠がなかったことは閣議決定されている。 教育の一環である修学旅行で、日本政府が『事実と違う』と抗議していることを学ばせようと していたのではないか。『教育の自主性』では許容できない。 国益に反する洗脳教育が行われる危険がある」と語った。 私立高校Kは6日、保護者などの強い抗議を受けて、修学旅行先を韓国から国内に変更することを発表した。 同校が予定していた訪問先には、「西大門刑務所歴史館」や「安重根義士記念館」など、 日本や日本人に敵意や憎悪を植え付けるような場所も並んでいた。 片山氏は「K校だけとは思えない。インターネットを見ると、似たような修学旅行をしている学校がありそうだ。 背後に、国内の『反日組織』が関与している疑いもある。早急に実態を調べたい」と語っている。 www.zakzak.co.jp/society/politics/news/20120910/plt1209101131001-n1.htm
- 133 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 09:18:00.74 ]
- XmlSerializerはよく使われているみたいだけどWinMDではなくなるんだよな
マイクロソフトにとってはレガシーってことじゃないの?
- 134 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 09:18:32.83 ]
- レガシー・・・マイファースト
- 135 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 10:02:21.50 ]
- >>133
MF系を除いて、XmlSerializerが削られた.NETは今のところ無い msdn.microsoft.com/en-us/library/windows/apps/system.xml.serialization.xmlserializer.aspx .NETのユーティリティ的な機能の中でこれほど大事にされてるものも珍しいと思う レガシーも糞も、WCF系とは全く役割が違うし
- 136 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 10:55:20.19 ]
- >>135
ありがとさん www.atmarkit.co.jp/fdotnet/chushin/win8appdev_01/win8appdev_01_04.html に書いてあることは嘘ってことか
- 137 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 11:05:04.90 ]
- LINQ to XMLの利用で代替とか言ってるからXML DOMと間違えてるんじゃないの
デスクトップ版と比べた差は大まかに以下の通り、で非ジェネリックコレクションと XmlSerializerだけ挙げてるってちょっと酷いなw コレクションの方はともかく、XmlSerializer(嘘だけど)みたいなちょっとしたユーティリティなんかより 挙げるべき重大な変更点はいくらでもあると思う。 まともに.NET使ったことないんじゃないのこの人
- 138 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 21:06:22.78 ]
- >>135
WCF系がXmlSerializerと役割が違うとは言い切れないのではないだろうか。 少なくともオブジェクト永続化という役割はかぶる。 DataContractSerializerはIXmlSerializableとSerialzableAttributeにも 対応しておりXmlSerializerの上位版といえる。標準では出力するXMLが汚いが 名前空間を空にすればXmlSerializerとほぼ同じ出力。加えてIDictionaryや 循環参照も扱うことができネットワークサービスにも対応しやすい。
- 139 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 21:13:11.93 ]
- >>138に追加
逆にXmlSerializerにしかできないことは順序制御と要素名マッピングしか知らない。 しかしこれが有効な場面は多くないだろうからDataContractSerializerは XmlSerializerを置き換えるといっても問題ないのではないだろうか。意見を求む。
- 140 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 22:20:40.54 ]
- 1つの*.csファイルに複数のクラスを書くの普通ですか?
javaだとあまりやらないと思うのですが、C++と同じ流派?
- 141 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 22:33:36.90 ]
- >>138
DataContractは細かい制御がほとんどできないので、 XMLのスキーマが予め決まってる場合全く役に立たない XmlSerializerはシリアライザというよりオブジェクト-XMLマッピングと考える方がいいと思う
- 142 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 22:45:58.92 ]
- >>140
Javaは一つのファイルにpublicクラスを一つしか置けないとか 1ファイル1パッケージとかわけのわからん制限があるが C#では論理構造とファイルシステムを完全に分けて考えるので特に決まりはない でも基本は1ファイル1クラス。MSのコード検査ツールを使うと一ファイルに複数の クラスがあると警告が出たりする。 >>138 XmlSerializerはまずXMLありきなんだよ。こういうXMLを生成したい、こういうXMLを読みたい、というのが先。 .NET付属のxsd.exeを使って、XMLを読み書きするための型をスキーマから自動生成したりすることもできる。
- 143 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 22:56:36.89 ]
- >>141
そういう用途は今はXElement+LINQじゃね?
- 144 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 22:59:03.52 ]
- >>143
型付きの方が便利な場合もあるだろう
- 145 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 23:00:50.77 ]
- それにXmlSerializerはXLINQで手書きするのとは違って
宣言的に読み書きできるというメリットもあるぞ
- 146 名前:デフォルトの名無しさん mailto:sage [2012/09/11(火) 23:18:16.41 ]
- >>115みたいな簡単な型はXmlSerializerでXML化して、単純にマッピングできないものは
IXmlSerializableを実装してその中でXElementを使うとか、 読むときもXElementで要素を検索してからXmlSerializerでデシリアライズするとか 柔軟に組み合わせるのが賢いと思うよ。 余計なコードを書かないで済むに越したことはない。
- 147 名前:デフォルトの名無しさん [2012/09/13(木) 00:41:30.01 ]
- SQLサーバーから取り出した検索結果をDatatableで取り出したとき、
その取り出した中身のデータ型は、SQLサーバーでの定義に依存しているんですか? つまりvarcharならstringになるとか
- 148 名前:デフォルトの名無しさん mailto:sage [2012/09/13(木) 02:54:03.95 ]
- >>147
msdn.microsoft.com/ja-jp/library/vstudio/cc716729
- 149 名前:デフォルトの名無しさん mailto:sage [2012/09/13(木) 08:10:13.68 ]
- >>148
ありがとうございました
- 150 名前:デフォルトの名無しさん [2012/09/13(木) 21:28:21.84 ]
- 20120913という文字列型の文字列を
│2012-09-13│ というフォーマットで出したいです String.Format("│yyyy-mm-dd│", "20120913") ではダメなんですが、どうすればいいのでしょうか・・・・
- 151 名前:デフォルトの名無しさん mailto:sage [2012/09/13(木) 21:32:30.72 ]
- >>150
var date = DateTime.ParseExact("20120913", "yyyyMMdd", CultureInfo.InvariantCulture); Console.WriteLine(date.ToString("| yyyy-MM-dd |", CultureInfo.InvariantCulture));
- 152 名前:デフォルトの名無しさん [2012/09/13(木) 22:02:08.90 ]
- >>150
そんなに手間がかかるのでしょうか・・・ 実は.NET2.0のためvarは使えませんが、他に何か方法はありませんか
- 153 名前:150 [2012/09/13(木) 22:02:28.70 ]
- >>151
アンカー間違えました
- 154 名前:デフォルトの名無しさん mailto:sage [2012/09/13(木) 22:06:42.37 ]
- >>152
varの代わりにDateTimeと書くだけ。他は2.0基準。 たかが2行だけだろ。
- 155 名前:デフォルトの名無しさん mailto:sage [2012/09/13(木) 22:07:16.29 ]
- StringBuilderに入れてInsert
Substringで繋ぐ お好きな方をどうぞ どっちも小奇麗ではない 小奇麗な方法がよければ青い鳥を探して言語を変えよう ここにはありませんのだ
- 156 名前:デフォルトの名無しさん mailto:sage [2012/09/13(木) 22:09:06.78 ]
- 手間ってどういうこっちゃ
ヘルパメソッドにでもすればいいだろ 毎回コピペとかすんなよ?
- 157 名前:デフォルトの名無しさん mailto:sage [2012/09/13(木) 22:12:04.27 ]
- >>151で手間とか言ってたら一体何ができるというのか
- 158 名前:150 [2012/09/13(木) 22:25:13.01 ]
- 皆さんありがとうございました
- 159 名前:デフォルトの名無しさん mailto:sage [2012/09/13(木) 22:25:28.91 ]
- スライスができる言語ならもう少しマシには書けるかもな
ま、ないものねだりという奴だな 汚いインターフェースが嫌なら自分でラッパーを書けと リーダブルコードには書いてあったな
- 160 名前:デフォルトの名無しさん mailto:sage [2012/09/13(木) 22:58:33.33 ]
- こうか
"|" + "20120913".Insert(6, "-").Insert(4, "-") + "|"
- 161 名前:150 [2012/09/13(木) 23:18:31.68 ]
- ありがとうございます
誰が書いてもすっきりと書けないなら、とりあえず安心です
- 162 名前:デフォルトの名無しさん [2012/09/14(金) 00:02:30.15 ]
- DataTable.Columns.Add("カラム名")として、データ型を省いた場合、その列にはObject型みたいな感じでなんでもはいるのですか?
- 163 名前:デフォルトの名無しさん mailto:sage [2012/09/14(金) 03:21:34.09 ]
- >>162
ここに質問するよりMSDNでも見て自分で調べた方が早いだろうに msdn.microsoft.com/ja-jp/library/52xzw8tf 既定では、新しい列の DataType は文字列になります。
|

|