为什么在XML序列化期间将名称空间添加到子节点?

问题描述 投票:1回答:1

我有一个用于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;
        }
    }
}
c# xml xml-serialization xmlserializer
1个回答
1
投票

基于Xxx<T>没有公共的无参数构造函数的事实,我可疑

您实际拥有的是类似的东西:
© www.soinside.com 2019 - 2024. All rights reserved.