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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

2回答

5414閲覧

Xmlシリアライズ 継承クラスのシリアライズ

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/09/04 07:18

以下のような継承クラスにてXmlシリアライズをおこなうと
親クラスのプロパティがシリアライズされません。
何か方法はあるでしょうか。

C#

1[XmlRoot("DataA")]] 2class DataA 3{ 4 private DataC _c; 5 [XmlElement("DataC")] 6 public DataC _c 7 { 8 get { return _c; } 9 set { _c = value; } 10 } 11} 12 13class DataB 14{ 15 private string pName; 16 [XmlElement("Name")] 17 public string pName 18 { 19 get { return pName; } 20 set { pName = value; } 21 } 22} 23 24class DataC : DataB 25{ 26 private string pAddress; 27 [XmlElement("Address")] 28 public string pAddress 29 { 30 get { return pAddress; } 31 set { pAddress = value; } 32 } 33}

これをシリアライズすると

xml

1<?xml version="1.0" encoding="shift_jis"?> 2<DataA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 3 <DataC> 4 <Address /> 5 </DataC> 6</DataA>

になり、親クラスの "Name" がシリアライズされません。

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

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

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

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

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

guest

回答2

0

質問に掲載するならコンパイルできることを確かめてからにしてください。
悪いところはたくさんありましたので全部直しました。

C#

1using System; 2using System.IO; 3using System.Xml.Serialization; 4 5namespace ConsoleApp1 6{ 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 var serizlizer = new XmlSerializer(typeof(DataA)); 12 using (var writer = new StringWriter()) 13 { 14 var data = new DataA(); 15 data.C = new DataC() { Address = "America", Name = "John" }; 16 serizlizer.Serialize(writer, data); 17 Console.WriteLine(writer.ToString()); 18 } 19 Console.ReadKey(); 20 } 21 } 22 23 [XmlRoot("DataA")] 24 public class DataA 25 { 26 private DataC _c; 27 [XmlElement("DataC")] 28 public DataC C 29 { 30 get { return _c; } 31 set { _c = value; } 32 } 33 } 34 35 public class DataB 36 { 37 private string pName; 38 [XmlElement("Name")] 39 public string Name 40 { 41 get { return pName; } 42 set { pName = value; } 43 } 44 } 45 46 public class DataC : DataB 47 { 48 private string pAddress; 49 [XmlElement("Address")] 50 public string Address 51 { 52 get { return pAddress; } 53 set { pAddress = value; } 54 } 55 } 56} 57

投稿2018/09/04 10:30

Zuishin

総合スコア28656

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

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

退会済みユーザー

退会済みユーザー

2018/09/05 00:24

タイプミス等ありましたが、サンプルなので。 コードの添削を求めているわけではなく、目的を達成するのに なにがどう違うのか記載が無ければ、アンサーとして不十分です。
Zuishin

2018/09/05 00:26

何がどう違うのかは比べてみればわかります。 「どこが間違っていますか?」という質問で間違いだらけのサンプルは意味がありません。 タイプミスも間違いですからうまくいかない原因で修正対象です。
Zuishin

2018/09/05 00:46

で、この回答で意図通りシリアライズできませんか? できるなら、私が修正したからです。 短いソースですから、何が間違っていたかくらい横着せず自分で確かめてください。
退会済みユーザー

退会済みユーザー

2018/09/05 00:55

ここは横着をするためのサイトだと認識していますが?(笑) 要求に対して全然回答になってません。 コード見て探せじゃ話ならない。 承認欲求をみたしたいなら他でやってください。
Zuishin

2018/09/05 00:58

横着をするためのサイトという認識は間違っています。 問題は修正しましたので回答になっています。 退会するなら大口を叩かないことですね。負け犬の遠吠えにしか見えませんから。
guest

0

各クラスに
[Serializable()]
つけるとか

投稿2018/09/04 07:36

y_waiwai

総合スコア87719

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

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

退会済みユーザー

退会済みユーザー

2018/09/04 08:21

Deserializeでは読めていますが serializeで書き込めません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問