2011-08-02 6 views
7

派生オブジェクトのリストを含むディクショナリをシリアライズするときに問題があります。存在しないことにするタイプ:直列化された出力は、私は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); 

結果はありません。

答えて

12

今日もう一度それに遭遇し、不調になったので、答えがありませんでした。

それは、フィールド内のオブジェクトのリストですまたはプロパティが上にこれを追加した場合:それは単一のオブジェクトが追加なら

[XmlArrayItem(Type = typeof(Turbine))] 
[XmlArrayItem(Type = typeof(Station))] 

...

[XmlElement(Type = typeof(Turbine))] 
[XmlElement(Type = typeof(Station))] 
+0

感謝の男、それは私をたくさん助けました。この答えは解決策として受け入れられるべきです。 –

+0

これは両方の派生型に対して同じXML要素名を使用することはできません。以下のような解決策があります:http://stackoverflow.com/a/1730412/3088208 – pvgoran

-1

私はほぼ同じ問題を解決しましたが、投稿したコードとの違いはほとんどありません。

属性を複数のアスペクトとして配置しようとしましたが、派生した要素プロパティの上に配置しましたか?私はそのようにしています。さらに、すべてのクラスに[Serializable]属性を追加しました。

関連する問題