我正在轉換我的工作XML序列化,以便模型類從抽象基類繼承(以允許將來使用不同的串行格式)。如何使用派生類進行XML序列化?
我的序列化按原樣工作正常,但是當我切換到使用從基類派生的模型時,我得到各種異常,所以我不確定如何繼續。
我的階級基礎類是:
namespace Data
{
public abstract class Configuration
{
public abstract string Schema { get; set; }
public abstract Command[] Commands { get; set; }
}
public abstract class Command
{
public abstract string Name { get; set; }
}
}
我的派生具體類(即工作得很好其所來源前級),然後在子命名空間:
namespace Data.Xml
{
[Serializable()]
[XmlType(AnonymousType = true)]
[XmlRoot(Namespace = "", IsNullable = false)]
public class Configuration : Data.Configuration
{
[XmlAttribute("noNamespaceSchemaLocation",
Namespace = System.Xml.Schema.XmlSchema.InstanceNamespace)]
public override string Schema { get; set; }
[XmlArrayItem("Command", IsNullable = false)]
public override Data.Command[] Commands { get; set; }
}
[Serializable()]
public class Command : Data.Command
{
public override string Name { get; set; }
}
}
我打電話該子名稱空間內的序列化程序如下所示:
public override Data.Configuration DeserializeConfig(StreamReader config)
{
var cs = new XmlSerializer(typeof(Configuration),
new Type[] { typeof(Command) });
return (Configuration)ConfigSerializer.Deserialize(ConfigStreamReader);
}
public override string SerializeConfig(Data.Configuration c, Encoding encoding)
{
string Output = null;
var Stream = new MemoryStream();
using (var Writer = new XmlTextWriter(Stream, encoding))
{
Writer.Formatting = Formatting.Indented;
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("xsi", XmlSchema.InstanceNamespace);
(new XmlSerializer(typeof(Configuration))).Serialize(Writer, c, ns);
Output = encoding.GetString(Stream.ToArray());
}
Stream.Dispose();
return Output;
}
生成的XML應該看起來像:
<?xml version="1.0" encoding="utf-8"?>
<Configuration
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="SomeSchema.xsd">
<Commands>
<Command>
<Name>SomeNameValue</Name>
</Command>
</Commands>
</Configuration>
我看到當試圖實例化串行器(第一線在上述DeserializeConfig()
方法)以下異常:
InvalidOperationException異常:類型 'Data.Command' 和「Data.Xml.Command '都使用命名空間''中的XML類型名稱'Command'。使用XML屬性爲類型指定唯一的XML名稱和/或名稱空間。
我真的不知道爲什麼串行試圖創建從基類的東西,肯定的名稱是相同的,那是一種派生和命名空間等的念頭...... 如何正確用屬性標記它以正確地解除/序列化?
FYI:我沒有看到已經在這幾個問題,但答案似乎都不夠具體,對提問者的要求,我無法工作,如何將信息應用到這一點,看似簡單,場景。
更新:我想通了如何通過包括類型串行化的實例,而不必標註的基類,所以我已刪除的那部分從我的問題,更新的代碼。這超出了布魯諾的建議和我的迴應(儘管建議的問題仍然不適用)。
更新:我試圖通過增加派生類的命名空間(即添加[XmlElement(Namespace = "http://www.foo.com/data/xml")]
在派生類中的每個屬性)在XML命名空間的名字分開,但這沒有什麼區別爲串行似乎仍然「看「基礎和派生類都在一起,因此認爲它們都在該名稱空間中。
這是https://stackoverflow.com/questions/3326481/c的重複問題-sharp的XML序列化-的派生類? –
@ bruno.almeida,不,我已經應用了'XmlInclude'屬性。 – Toby
這是你的類名混淆編譯器。網絡庫有System.Net.Data和System.Net.Xml。您正在使用的類名稱正在複製Net庫名稱。所以要麼改變名稱,要麼使用全名,比如MyProject.Data.Xml。 – jdweng