如何使用属性序列化类

时间:2009-03-27 08:56:07

标签: c# xml-serialization

我有一个有

的课程
[XmlRoot]
<snip>

[XmlAttribute(AttributeName="x:uid")]
public string uid;

<snip>

在编译时没关系..但是在运行时, 异常发生在

XmlSerializer serializer = new XmlSerializer(typeof(myClass));

因为“x:uid”中的字符无效.. 我的类中的元素需要有一个“x:uid”属性用于本地化目的.. 我怎么能这样做?

谢谢!

3 个答案:

答案 0 :(得分:8)

要设置属性的命名空间,您需要使用XmlAttributeAttribute的{​​{3}}属性。

如果用于该命名空间的前缀是“x”特别重要,那么您可以在进行序列化时使用Namespace类来控制它,可选择使用XmlSerializerNamespaces


这是一个有效的例子:

[XmlRoot(Namespace = "http://foo")]
public class MyClass
{
    private XmlSerializerNamespaces xmlns;

    [XmlNamespaceDeclarations]
    public XmlSerializerNamespaces Xmlns 
    {
        get
        {
            if (xmlns == null)
            {
                xmlns = new XmlSerializerNamespaces();
                xmlns.Add("x", "http://xxx");
            }
            return xmlns;
        }
        set { xmlns = value; }
    }

    [XmlAttribute("uid", Namespace = "http://xxx")]
    public int Uid { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var s = new XmlSerializer(typeof(MyClass));
        s.Serialize(Console.Out, new MyClass { Uid = 123 });
        Console.ReadLine();
    }
}

产生:

<?xml version="1.0" encoding="ibm850"?>
<MyClass 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:x="http://xxx" 
    x:uid="123" 
    xmlns="http://foo"/>

答案 1 :(得分:5)

您需要指定实际的命名空间 - 而不是别名(编写者将决定):

[XmlAttribute(AttributeName="uid", Namespace="http://my/full/namespace")]
public string uid;

请注意,对于命名空间等使用“const string”是很常见的。此外,公共字段不是一个好主意 - 使用C#3.0可以拥有(xml属性未显示):

public string Uid {get;set;}

答案 2 :(得分:0)

据我所知,您不能在C#XML属性声明中使用名称空间前缀。试试“uid”而不是“x:”