XML序列化错误:2种类型都使用XML类型名称“关系”,来自命名空间''

时间:2011-02-11 10:28:09

标签: c# xml exception-handling xml-serialization

我遇到了通过XML序列化的问题,因为2个clases使用一个名为Relationship的类(尽管是不同的类!)。我尝试使用XML属性用另一个名称装饰其中一个类,但它仍然给出了以下错误:

  

{“Types'SiteServer.Relationship'和'LocalServer.Relationship'都使用XML类型名称'Relationship',来自命名空间''。使用XML属性为该类型指定唯一的XML名称和/或名称空间。 “}

以下是我的2节课,有谁知道为什么?我使用错误的属性?它似乎忽略了它: - )

public class SiteServer
{
    [XmlRoot("SiteServerRelationShip")]
    public class Relationship
    {
        public string type { get; set; }
    }

    public string Name { get; set; }

    public Relationship Relate = new Relationship();
}

public class LocalServer
{
    public class Relationship
    {
        public string type { get; set; }
    }

    public string Name { get; set; }

    public Relationship Relate = new Relationship();
}

4 个答案:

答案 0 :(得分:13)

用XmlRoot装饰你的两个类,如下所示:

[XmlRoot("SiteServer", Namespace="http://example.com/schemas/SiteServer")]
public class SiteServer
{        
    [XmlRoot("SiteServerRelationShip", Namespace="http://example.com/schemas/SiteServer")]
    public class Relationship
    {
        public string type { get; set; }
    }

    public string Name { get; set; }

    public Relationship Relate = new Relationship();
}

[XmlRoot("LocalServer", Namespace="http://example.com/schemas/LocalServer")]
public class LocalServer
{
    [XmlRoot("LocalServerRelationship", Namespace="http://example.com/schemas/LocalServer")]
    public class Relationship
    {
        public string type { get; set; }

    }

    public string Name { get; set; }

    public Relationship Relate = new Relationship();
}

这将为两个RelationShip类生成两个不同的FQDN:

{http://example.com/schemas/LocalServer}LocalServerRelationShip
{http://example.com/schemas/SiteServer}SiteServerRelationShip

答案 1 :(得分:6)

[XmlRoot]仅用于文档的根元素。您想在其他类型上使用[XmlType]

此外,您不需要[Serializable]。 XML Serializer忽略它。

答案 2 :(得分:1)

您还必须装饰字段,例如:

[XmlInclude(typeof(Relationship))]
public class SiteServer
{
    [XmlRoot("SiteServerRelationship", Namespace = "http://example.com/schemas/SiteServerRelationship")] 
    public class Relationship
    {
        public string type { get; set; }
    }

    public string Name { get; set; }

    [XmlElement("SiteServerRelationship", Namespace="http://example.com/schemas/SiteServerRelationship")]       
    public Relationship Relate = new Relationship();
}


[XmlInclude(typeof(Relationship))]    
public class LocalServer
{
    [XmlRoot("LocalServerRelationship", Namespace = "http://example.com/schemas/LocalServerRelationship")] 
    public class Relationship
    {
        public string type { get; set; }
    }

    public string Name { get; set; }

    [XmlElement("LocalServerRelationship", Namespace="http://example.com/schemas/LocalServerRelationship")] 
    public Relationship Relate = new Relationship();
}

答案 3 :(得分:0)

我在一个应用程序中使用的两个第三方Web服务遇到了这个问题。奇怪的是,动态运行时生成很好(虽然花了2分钟),但是sgen.exe很不高兴。

解决方案是使用svcutil.exe ...

svcutil.exe /t:xmlSerializer targetAssemblyOrExecutable  /out:targetAssemblyOrExecutable.XmlSerializers.dll.cs

然后使用csc.exe编译它。