ns1: проблема десериализации C#

Ниже приведен тестовый код, используемый для получения проблемы ns1: я всегда получаю объект, в котором ничего нет.

если я удалю два [XmlType] и [XmlRoot] это ошибки.

Я уверен, что кто-то уже должен был столкнуться с проблемой, не получая правильный термин для поиска, вероятно,

надеюсь, что это простая вещь.

[XmlType(AnonymousType = true, Namespace = "http://itaintworking.com/test/")]
[XmlRoot(Namespace = "http://itaintworking.com/test/", IsNullable = false)]
public class Clients
{
    public string clientName { get; set; }
    public addressDetails addressDetails { get; set; }
}

public class addressDetails
{
    public int addressId { get; set; }
}

[Test(Description = "Serialization Exception")]
public void CheckDeserializer()
{
    var strXml =
        "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><ns1:Clients xmlns:ns1=\"http://itaintworking.com/test/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ><clientName>hello</clientName><addressDetails><addressId>98989</addressId></addressDetails></ns1:Clients>";
    var x = XmlSerializer<Clients>.Deserialize(strXml);
    Assert.IsNotNull(x);
}

Я использую некоторый код, который использует дженерики, есть еще один метод, по умолчанию использующий кодировку UTF8, и нуль для xmlReaderSetting.

/// <summary>
/// Deserializes a XML string into an object
/// </summary>
/// <param name="xml">The XML string to deserialize</param>
/// <param name="encoding">The encoding</param>
/// <param name="settings">XML serialization settings. <see cref="System.Xml.XmlReaderSettings"/></param>
/// <returns>An object of type <c>T</c></returns>
public static T Deserialize(string xml, Encoding encoding, XmlReaderSettings settings)
{
    if (string.IsNullOrEmpty(xml))
        throw new ArgumentException("XML cannot be null or empty", "xml");

    var xmlSerializer = new XmlSerializer(typeof(T));
    using (var memoryStream = new MemoryStream(encoding.GetBytes(xml)))
    {
        using (var xmlReader = XmlReader.Create(memoryStream, settings))
        {
            return (T)xmlSerializer.Deserialize(xmlReader);
        }
    }
}

person bhushanvinay    schedule 24.09.2015    source источник


Ответы (1)


Непонятно, как именно вы хотите, чтобы это было исправлено.

В настоящее время в XML элементы clientName и addressDetails внутри элемента Clients не находятся в одном и том же пространстве имен. Итак, одно исправление:

[XmlType(AnonymousType = true, Namespace = "http://itaintworking.com/test/")]
[XmlRoot(Namespace = "http://itaintworking.com/test/", IsNullable = false)]
public class Clients
{
    [XmlElement(Namespace="")]
    public string clientName { get; set; }
    [XmlElement(Namespace = "")]
    public addressDetails addressDetails { get; set; }
}

Другое исправление может заключаться в изменении пространств имен в XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:Clients xmlns:ns1="http://itaintworking.com/test/"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <ns1:clientName>hello</ns1:clientName>
   <ns1:addressDetails>
       <ns1:addressId>98989</ns1:addressId>
   </ns1:addressDetails>
 </ns1:Clients>
person Damien_The_Unbeliever    schedule 24.09.2015
comment
Ты потрясающий, Дэмиен, все, что мне было нужно, это XmlElement(Namespace=), который решает проблему - person bhushanvinay; 24.09.2015