2012-11-12 130 views
2

我試圖向XmlSerializor添加一些提示,以便它可以序列化/反序列化接口。我不能添加XmlIncludeAttribute作爲裝飾的類,在代替我想系列化覆蓋傳遞到XmlSerializor:以編程方式添加XmlIncludeAttribute

var _xs = new XmlSerializer(typeof(Model.ISession), SerializationOverrides()); 

SerializationOverrides()看起來是這樣的:

private static XmlAttributeOverrides SerializationOverrides() 
{ 
    var overrides = new XmlAttributeOverrides(); 

    overrides.Add(typeof(Model.ISession), XmlInclude(typeof(Model.Session))); 

    return overrides; 
} 

到目前爲止,太好了。 XmlInclude(...)方法創建一個新的XmlAttributes對象,但我無法弄清楚如何添加XmlIncludeAttribute屬性。

private static XmlAttributes XmlInclude(Type type) 
{ 
    var attrs = new XmlAttributes(); 

    attrs....Add(new XmlIncludeAttribute(type)); // Add how????? 

    return attrs; 
} 

建議?

回答

2

XmlSerializer的構造函數可以接受的 「額外類型」 的陣列,這樣的:

var _xs = new XmlSerializer(typeof(Model.ISession), 
    SerializationOverrides(), new Type[] { typeof(Model.Session), 
    new XmlRootAttribute("Session"), ""); 

否則那以及添加附加XmlElements覆蓋似乎是在伎倆:

private static XmlAttributeOverrides SerializationOverrides() 
{ 
    var overrides = new XmlAttributeOverrides(); 

    overrides.Add(typeof(Model.ISession), XmlInclude("Session", typeof(Model.Session))); 

    return overrides; 
} 

private static XmlAttributes XmlInclude(string name, Type type) 
{ 
    var attrs = new XmlAttributes(); 
    attrs.XmlElements.Add(new XmlElementAttribute(name, type)); 
    return attrs; 
} 
0

據我所知,你不能
你必須在編譯時提供屬性。
屬性是靜態數據,你最好的選擇可能是使用TypeDescriptor。 (看看TypeDescriptor.CreateProperty) 也許你可以嘗試創建一個具有必要屬性的派生類?

編輯。看起來你可以!

參見Marc Gravell answer here

例如:

var aor = new XmlAttributeOverrides(); 
     var Attribs = new XmlAttributes(); 
     Attribs.XmlElements.Add(new XmlElementAttribute("Session", typeof(Model.Session))); 
     aor.Add(typeof(type), "Models", listAttribs); 

     XmlSerializer ser = new XmlSerializer(typeof(type), aor);