我有一个用于XML序列化的类,如下所示:
[XmlRoot(ElementName = "XXX", Namespace = "http://www.example.com/Schemas/xxx/2011/11")]
public class Xxx<T> where T: Shipment
{
[XmlAttribute("version")]
public string Version = "1.1";
public T Shipment { get; set; }
public Xxx(string dataTargetType)
{
Shipment = (T)Activator.CreateInstance(typeof(T));
Shipment.DataContext = new DataContext
{
DataTargetCollection = new DataTargetCollection
{
DataTarget = new DataTarget
{
Type = dataTargetType
}
}
};
}
}
[XmlType("Shipment")]
public class Shipment
{
public DataContext DataContext { get; set; }
}
序列化时将输出以下XML:
<?xml version="1.0" encoding="utf-8"?>
<XXX xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Shipment xmlns="http://www.example.com/Schemas/xxx/2011/11">
<DataContext>
<DataTargetCollection>
<DataTarget>
<Type>WarehouseOrder</Type>
</DataTarget>
</DataTargetCollection>
</DataContext>
</Shipment>
</XXX>
为什么将xmlns名称空间属性添加到Shipment
节点而不是根XXX
节点?
继承和序列化中的使用示例:(解决序列化问题时的人为设计示例)
public class XxxVariation: Xxx<Shipment>
{
public const string DataTargetType = "Something";
public XxxVariation() : base(DataTargetType) {}
}
public async Task<string> CreateXxxVariationAsync(string todo)
{
var request = new XxxVariation();
string xmlRequest = SerializeRequest(request);
return await PostRequestAsync(xmlRequest);
}
private static string SerializeRequest<T>(T request)
{
using (var stream = new MemoryStream())
{
var serializer = new XmlSerializer(typeof(T));
serializer.Serialize(XmlWriter.Create(stream), request);
using (var reader = new StreamReader(stream))
{
stream.Seek(0, SeekOrigin.Begin);
string xml = reader.ReadToEnd();
return xml;
}
}
}
基于Xxx<T>
没有公共的无参数构造函数的事实,我可疑