XMLを直列化と継承の種類
-
09-06-2019 - |
質問
下から 前の質問 って自分のオブジェクトモデルserializeる形式をサポートしています。しかし今作に取り掛かる前にcssプロパティの問題(quelleがあります。).
の問題にしているのはコレクションでは、抽象基底クラスタイプは、人口によるコンクリート由来のものです。
なのかなと思っていることだけで追加のXML属性ですべてのクラスのもうpeachy.しかし残念なかなかのケースです!
なのでいろいろやってみました掘Googleいてはよくわか なぜ その上で使用すれば問題ありません。その の XmlSerializer
はについて詳しく教えて欲しいあな反射するためserializeオブジェクトからXML、およびその抽象タイプなどの地獄での話.ます。
やっく このページ にCodeProjectには、今でもヘ景色は駅の屋根だけという未読み取り/消費完全にが、私は私がこの問題にStackOverflowテーブルにも、きっhacks/技を得るためにこの起動-実行の迅速/最軽量です。
そもフォッパゴンドラリフトとラークI ない 行きたいの XmlInclude
ます。あるだけでもカップリングで、このシステムでは、この不整頭痛!
解決
問題を解消!
OKなのだそして私が確かと 多く のら こちらの!).
なので、根拠:
目的:
- んの XmlInclude ルートにより、在籍ます。
- 一度解決策を見出すことに合意したと思っています迅速に実施します。
- 館の概要種類が使用され、個々の要旨ます。
- んたいざとどうしていくべきなのかについて"特別な"もののコンクリート。
の課題を特定/注意点:
- XmlSerializer なにか良いものにな反射で 非常に 限定ですが、抽象の種類(まだ作品のインスタンスの抽象タイプそのものはサブクラス).
- Xmlのデコレータ属性を定義がどのようXmlSerializerの特性、その発見をする。の体型に指定することもでき、この作成 締結 間のクラスのシリアライザ(せん。
- し、独自のXmlSerializerを作を実装したクラス IXmlSerializable .
の溶液
作成した汎用的なクラスを指定する汎用型としての抽象型設計することができます。このクラスの"翻訳"とは抽象タイプのコンクリートタイプすることも出来ますのでハード-コードの鋳造(まで詳細情報をXmlSerializerしております。
その後、実施の IXmlSerializable インタフェース、あん、が理し、直列化する必要がありまを書いていますのタイプのコンクリートのクラスは、XMLまでのキャストでは、直列化さ.も重要となる場合がございますのでご了承する必要 完全修飾 としてのアセンブリの二つのクラスでが異なります。ありもちろんの少しタイプチェックともいう。
以降、XmlSerializerできなキャストしを提供する必要があり、コードなので、暗黙的なオペレーターはその過負荷をかんでも知っていなにができる。).
このコードのAbstractXmlSerializerです:
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
namespace Utility.Xml
{
public class AbstractXmlSerializer<AbstractType> : IXmlSerializable
{
// Override the Implicit Conversions Since the XmlSerializer
// Casts to/from the required types implicitly.
public static implicit operator AbstractType(AbstractXmlSerializer<AbstractType> o)
{
return o.Data;
}
public static implicit operator AbstractXmlSerializer<AbstractType>(AbstractType o)
{
return o == null ? null : new AbstractXmlSerializer<AbstractType>(o);
}
private AbstractType _data;
/// <summary>
/// [Concrete] Data to be stored/is stored as XML.
/// </summary>
public AbstractType Data
{
get { return _data; }
set { _data = value; }
}
/// <summary>
/// **DO NOT USE** This is only added to enable XML Serialization.
/// </summary>
/// <remarks>DO NOT USE THIS CONSTRUCTOR</remarks>
public AbstractXmlSerializer()
{
// Default Ctor (Required for Xml Serialization - DO NOT USE)
}
/// <summary>
/// Initialises the Serializer to work with the given data.
/// </summary>
/// <param name="data">Concrete Object of the AbstractType Specified.</param>
public AbstractXmlSerializer(AbstractType data)
{
_data = data;
}
#region IXmlSerializable Members
public System.Xml.Schema.XmlSchema GetSchema()
{
return null; // this is fine as schema is unknown.
}
public void ReadXml(System.Xml.XmlReader reader)
{
// Cast the Data back from the Abstract Type.
string typeAttrib = reader.GetAttribute("type");
// Ensure the Type was Specified
if (typeAttrib == null)
throw new ArgumentNullException("Unable to Read Xml Data for Abstract Type '" + typeof(AbstractType).Name +
"' because no 'type' attribute was specified in the XML.");
Type type = Type.GetType(typeAttrib);
// Check the Type is Found.
if (type == null)
throw new InvalidCastException("Unable to Read Xml Data for Abstract Type '" + typeof(AbstractType).Name +
"' because the type specified in the XML was not found.");
// Check the Type is a Subclass of the AbstractType.
if (!type.IsSubclassOf(typeof(AbstractType)))
throw new InvalidCastException("Unable to Read Xml Data for Abstract Type '" + typeof(AbstractType).Name +
"' because the Type specified in the XML differs ('" + type.Name + "').");
// Read the Data, Deserializing based on the (now known) concrete type.
reader.ReadStartElement();
this.Data = (AbstractType)new
XmlSerializer(type).Deserialize(reader);
reader.ReadEndElement();
}
public void WriteXml(System.Xml.XmlWriter writer)
{
// Write the Type Name to the XML Element as an Attrib and Serialize
Type type = _data.GetType();
// BugFix: Assembly must be FQN since Types can/are external to current.
writer.WriteAttributeString("type", type.AssemblyQualifiedName);
new XmlSerializer(type).Serialize(writer, _data);
}
#endregion
}
}
では、これからが、どのようにしてそのXmlSerializer高い技術を持ったシリアライザよりもデフォルト?しなければ合格式のXml属性typeプロパティは、例えば:
[XmlRoot("ClassWithAbstractCollection")]
public class ClassWithAbstractCollection
{
private List<AbstractType> _list;
[XmlArray("ListItems")]
[XmlArrayItem("ListItem", Type = typeof(AbstractXmlSerializer<AbstractType>))]
public List<AbstractType> List
{
get { return _list; }
set { _list = value; }
}
private AbstractType _prop;
[XmlElement("MyProperty", Type=typeof(AbstractXmlSerializer<AbstractType>))]
public AbstractType MyProperty
{
get { return _prop; }
set { _prop = value; }
}
public ClassWithAbstractCollection()
{
_list = new List<AbstractType>();
}
}
ここでは、コレクションの単一性について、無限の可能性を感じさせるいは追加の タイプ 指定されたパラメータをXml宣言が簡単にできます!●D
注意:ご利用の場合、このコードことに感謝してい掛け声だけます。また、シンガポール、インド、タイ、ア人の地域:)
のものに迷ったらどう答えがここに来た親のリーディングです。まupmodと感じることを明らかにした。あり(無犯罪者になびくことがあり一度にrep:)
興味深い問題を詳しく解決!:)
他のヒント
気をつけなければいけないのを見ていることをXmlSerialiserコンストラクタを渡すことができ配列の種類のserialiserが困難を解決す.また利用するにあるコレクションやイベント、講演、セミナーをdatastructuresする必要がserialised、人生の異なるセンブリー等
XmlSerialiserコンストラクタextraTypes param
編集:またこのアプローチの効XmlInclude属性などできるスケジュールを作の発見とそのリストを作成の可能コンクリートの種類実行時に、もしています。
真剣に拡張可能な枠組みのPOCOsいserialize XML確実です。なぜなら、そもそもできる保証人に使いづらいものが多くあり、クラス、botchあります。
しておくとよいでしょう活ーのための直列化さ御オブジェクトです。ということはXMLを直列化い分けるどれがいいですか?
のポシリアライザデシリアライザ、取り扱うジェネリック医薬品に問題なく、コレクションベースのクラスおよびインタフェースなどのコレクションに自身の実施 IList
または IDictionary
).あ注意などのマーキングをお読み取りのみの収集を行う DesignerSerializationAttribute
, が、手戻りコードを取り扱うこコーナーの場合でないと思います。
Pdflibは簡単に利用できるapiを更新すじているわけではありません忘れ去られたかのようです。
うことにより研究のようにな私を受賞する必要がありコードを取得します全部エクスペディアで。
これまでの
- の XmlSeralizer 基本的にクラスはあniftyの反射のクラスは直列化さ.を決定する物件に直列化されたの タイプ.
- その理由の問題が発生したタイプのミスマッチが起こっているもの BaseType その DerivedType ..なものと思われるかもしれませんので取り扱ってpolymorphicallyするものではありませんので必要に全く負荷の反射タイプ-チェックするよう設計されていません。
この行動ができるオーバーライド(コード申請中)により作成プロキシクラスとの間の双.この基本を判定するのに由来しserializeることとします。このプロキシクラスにしまうことによりスピーディなXMLのバックアップラインの双..
腕時計のこのスペース!^_^
それは確かに解決の問題が、課題もあり、やや障を及ぼすものをご使用する意図で"携帯型"XML形式です。悪いことが起きすることにしたとき、あなたの変更、次のバージョンのプログラムに必要な支援の両方のフォーマットの直列化の新旧がお客様をお使いのお母の古いファイル/データベース、またはその接続のサーバを用い古いバージョンの品)でも利用することはできませんserializatorなりますので使用
type.AssemblyQualifiedName
るようにな
TopNamespace.SubNameSpace.ContainingClass+NestedClass, MyAssembly, Version=1.3.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089
これ組み立ての属性およびバージョン---
現しようとした場合に変更を組み立て、または決まりましたし、この直列化復元しない。
もちろんのものと同様です。うまいすべてのXML属性を直列化は、コンクリートのクラスとしての性質のスク以外のリスクに電話をベースにクラス(必要な場合)個人向けに選択された情報を提供するド/直列化されたときにシリアライザに求めの方に。奥高尾にひっそりと建つ料亭。りのコーディング作業まで一な仕事のほうが良いよう力をシリアライザでは、正しいものです。
しかも、表記:
[XmlRoot]
public class MyClass {
public abstract class MyAbstract {}
public class MyInherited : MyAbstract {}
[XmlArray(), XmlArrayItem(typeof(MyInherited))]
public MyAbstract[] Items {get; set; }
}