【发布时间】:2020-09-04 02:57:45
【问题描述】:
我有一个为 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;
}
}
}
【问题讨论】:
-
我们可以在这里看到你用来序列化的代码吗?你在序列化什么对象 are,因为
Xxx<T>没有公共的无参数构造函数,所以我不认为它是 那个 -
@MarcGravell 我添加了一些代码来展示我如何序列化和继承类。无参构造函数没有区别,可能是因为继承自它的类已经有了无参构造函数。
-
编辑非常接近我的猜测,然后:)
标签: c# xml xml-serialization xmlserializer