C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: C#でXMLシリアライズと逆シリアライズ


(過去ログ 108 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■64237 / inTopicNo.1)  C#でXMLシリアライズと逆シリアライズ
  
□投稿者/ もろぞう (1回)-(2012/11/15(Thu) 22:29:17)

分類:[.NET 全般] 

C#駆け出し者です。
よろしくお願いします。

XMLファイルのシリアライズと逆シリアライズ処理を勉強中です。

下記の元XMLを処理すると復元XMLのように、valueが1つしか出力されません。
どのようにオブジェクトを構成したらよいのでしょうか?
ご教示よろしくお願いします。

元XML-----
<aaa>
<id>111</id>
 <type>aaa</type>
<bbb>
<ccc>
<value>1</value>
<value>2</value>
</ccc>
</bbb>
</aaa>
-------

復元XML-----
<aaa>
<id>111</id>
 <type>aaa</type>
<bbb>
<ccc>
<value>1</value>
</ccc>
</bbb>
</aaa>
-------


コード----
public class aaa
{
public string id { get; set; }
public string type { get; set; }
public List<ccc> bbb { get; set; }
}

public class ccc
{
public string value { get; set; }
}
-------

引用返信 編集キー/
■64238 / inTopicNo.2)  Re[1]: C#でXMLシリアライズと逆シリアライズ
□投稿者/ Jitta (16回)-(2012/11/15(Thu) 22:57:34)
Jitta さんの Web サイト
No64237 (もろぞう さん) に返信
> 下記の元XMLを処理すると復元XMLのように、valueが1つしか出力されません。
> どのようにオブジェクトを構成したらよいのでしょうか?
> ご教示よろしくお願いします。

 「こういうオブジェクトにしたい」というオブジェクトをシリアライズして、ファイルに落としてみてください。
すると、違いが見えてきます。

 bbb は ccc を複数持ちますが、ccc は value を一つしか持ちません。

引用返信 編集キー/
■64239 / inTopicNo.3)  Re[2]: C#でXMLシリアライズと逆シリアライズ
□投稿者/ もろぞう (2回)-(2012/11/16(Fri) 10:42:13)
Jittaさん

ご回答ありがとうございます。
下記のように変更したら希望通りの処理が出来ました。

コード----
public class aaa
{
public string id { get; set; }
public string type { get; set; }
public ccc bbb { get; set; }
}

public class ccc
{
[XmlElement]
public ArrayList value { get; set; }
}
-------

ありがとうございました。
解決済み
引用返信 編集キー/
■64240 / inTopicNo.4)  Re[2]: C#でXMLシリアライズと逆シリアライズ
□投稿者/ howling (80回)-(2012/11/16(Fri) 10:46:42)
2012/11/16(Fri) 10:52:57 編集(投稿者)

//返信かぶったので、解決済みにしておきます。

No64237 (もろぞう さん) に返信

こんにちわ。
うーん、見たところ、なんでこういうXMLになるんだろう?と思いました。

元XMLで、

<bbb>
<ccc>
<value>1</value>
<value>2</value>
</ccc>
</bbb>

こうなっていますが、これは本来

<bbb>
<ccc>
<value>1</value>
</ccc>
<ccc>
<value>2</value>
</ccc>
</bbb>

とならないとおかしいんじゃないのかなと。
cccの中にvalueは1つのみですから…。

もしかして、元XMLは自分で作りました?
もしそうならJittaさんのおっしゃる通りに実際にやってみるのも良いですし、
配列のシリアライズ方法を調べて、サンプルあたりをぽいっとやるとわかりやすいかと。

ではでは。
解決済み
引用返信 編集キー/
■64242 / inTopicNo.5)  Re[3]: C#でXMLシリアライズと逆シリアライズ
□投稿者/ Jitta (17回)-(2012/11/16(Fri) 22:17:56)
Jitta さんの Web サイト
No64239 (もろぞう さん) に返信

> ご回答ありがとうございます。
> 下記のように変更したら希望通りの処理が出来ました。
>
> コード----
> public class aaa
> {
> public string id { get; set; }
> public string type { get; set; }
> public ccc bbb { get; set; }
> }
>
> public class ccc
> {
> [XmlElement]
> public ArrayList value { get; set; }
> }
> -------

本当に?
このクラスのインスタンスをシリアライズすると、こうなるよ?

<?xml version="1.0"?>
<aaa xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<id>123</id>
<bbb>
<value xsi:type="xsd:string">1</value>
<value xsi:type="xsd:string">2</value>
</bbb>
</aaa>

一応、解決済みのままにしておくけど。
解決済み
引用返信 編集キー/
■64243 / inTopicNo.6)  Re[4]: C#でXMLシリアライズと逆シリアライズ
□投稿者/ もろぞう (3回)-(2012/11/16(Fri) 23:41:50)
howlingさん
回答ありがとうございます。

元XMLは自作です。cccのプロパティのvalueは複数持ちたいので
valueが分かれてしまうのは困るのです。

Jittaさん

回答ありがとうございます。
valueの属性がtypeになっていますね。。

質問時に載せたコードと回答した際のコードが若干違ってます。
混乱させてしまってますね。。すいません。

シリアライズ後は以下のようになっています。
<aaa xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<id>1234</id>
<type>hoge</type>
<bbb>
<ccc>
<value>1</value>
<value>2</value>
</ccc>
</bbb>
</aaa>

たびたび回答ありがとうございました。
これからもよろしくお願いします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -