派生オブジェクトのリストを含むディクショナリをシリアライズするときに問題があります。存在しないことにするタイプ:直列化された出力は、私はBaseAttributesを希望xsi:typeを持たない派生オブジェクトのシリアライズ
<BaseAttributes xsi:type="Turbine" Id="1975fe1f-7aa8-4f1d-b768-93ad262800cd">
は、タービンやXSIで置換することが含まれています。
<Turbine Id="1975fe1f-7aa8-4f1d-b768-93ad262800cd">
全体的に私のコードは以下のようになります。私はいくつかのクラス、例えばTurbineクラスを導出するクラスBaseAttributesを持っています。これらのクラスは、List of BaseAttributesを使用して辞書に格納されます。辞書は実装されたシリアライズ可能な辞書です。以下は一般的なコードです。
[XmlInclude(typeof(Turbine)), XmlInclude(typeof(Station)), XmlInclude(typeof(Substation))]
public class BaseAttributes {
[XmlAttribute("Id")]
public Guid Id;
}
public class Turbine : BaseAttributes {
private Element windSpeed;
public Element WindSpeed {
get { return windSpeed; }
set { windSpeed = value; }
}
public Turbine(float windSpeed){
this.windSpeed= new Element(windSpeed.ToString(),"ms");
}
//used for xmlserilization
private Turbine(){}
}
public class CollectionOfBaseAttributes {
public SerilizableUnitsDictionary<DateTime, List<BaseAttributes>> units;
}
[XmlRoot("dictionary")]
public class SerilizableUnitsDictionary<TKey, TValue>
: Dictionary<TKey, TValue>, IXmlSerializable {
public System.Xml.Schema.XmlSchema GetSchema() {
return null;
}
public void WriteXml(System.Xml.XmlWriter writer) {
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue), new XmlRootAttribute("Units"));
foreach (TKey key in this.Keys) {
writer.WriteStartElement("TimeStamp");
writer.WriteAttributeString("Value", key.ToString());
TValue value = this[key];
foreach (TValue value1 in Values) {
valueSerializer.Serialize(writer, value1);
}
writer.WriteEndElement();
}
}
私はXMLを逆シリアル化しないため、直列化にはDataContractorを使用しません。私は「ちょうど」属性を持つXMLファイルを作成したいと考えています。
私はXmlElementOverridesを使用しようとしましたが、おそらく私が使用しているだけで理解できないものがあります。現在、私はこれを次のように使用しようとしました:
XmlAttributes attrs = new XmlAttributes();
XmlElementAttribute attr = new XmlElementAttribute();
attr.ElementName = "Turbine";
attr.Type = typeof(Turbine);
attrs.XmlElements.Add(attr);
XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();
attrOverrides.Add(typeof(CollectionOfBaseAttributes), "BaseAttributes", attrs);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(CollectionOfBaseAttributes),attrOverrides);
結果はありません。
感謝の男、それは私をたくさん助けました。この答えは解決策として受け入れられるべきです。 –
これは両方の派生型に対して同じXML要素名を使用することはできません。以下のような解決策があります:http://stackoverflow.com/a/1730412/3088208 – pvgoran