🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

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

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

Q&A

1回答

2257閲覧

インターフェイスのコレクションをXML等で保存する方法

ymstrya1922

総合スコア14

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

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

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

0グッド

1クリップ

投稿2019/11/18 12:41

前提・実現したいこと

インターフェイスの集合(コレクション)をXMLSerializer等で保存したい
例:

C#

1interface IVehicle{ 2 string Name{ get; } 3} 4class Car : IVehicle{ 5 public string Name{ get; set; } 6 public int GasTank{ get; set; } 7} 8class Train : IVehicle{ 9 public string Name{ get; set; } 10 public int CarCount{ get; set; } 11} 12List<IVehicle> mVehicles;

このような時にmVehiclesを一括でxmlやjson等に保存したい。
もちろんNameだけでなく、コレクションの各アイテムの実態クラスによって、GasTankやCarCountも保存したい。

発生している問題・エラーメッセージ

今までXMLSerializerを使用してコレクションの内容を保存していたが、インターフェイスでは例外が発生してしまいシリアライズできない。

補足情報(FW/ツールのバージョンなど)

VS2017, C#7.0, .NET Framework4.7.2

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

インターフェースを XmlSerializer でシリアライズすることはできません。
インターフェースに対して SerializableAttribute を付与しようとしても失敗します。

そのインターフェースを実装した基本クラスから派生する方法を使うか、

How to Serialize an Interface using the XMLSerializer

あるいは LINQ to XML などを使って自力でシリアライズする方法が考えられます。

一方、NewtonSoft.Json を使えば、次のようにシリアライズできます。

C#

1Console.WriteLine(JsonConvert.SerializeObject(new IVehicle[] { new Car(), new Train() })); 2

このような時にmVehiclesを一括でxmlやjson等に保存したい。

投稿2019/11/18 13:11

編集2019/11/19 02:22
Zuishin

総合スコア28669

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

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

Zuishin

2019/11/18 13:13

NewtonSoft.Json は NuGet パッケージマネージャーを使ってインストールしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問