Ошибка XML Serialization: 2 типа используют имя типа XML, 'Relationship', из пространства имен ''

У меня возникла проблема сериализации через XML, потому что 2 класа используют класс (хотя и разные классы!), называемый Relationship. Я попытался украсить 1 из классов другим именем, используя атрибут XML, но он все равно дает мне следующую ошибку:

{ "Типы" SiteServer.Relationship "и" LocalServer.Relationship "используют имя типа XML" Связь "из пространства имен". Используйте атрибуты XML, чтобы указать уникальное имя XML и/или пространство имен для этого типа. "}

Вот мои 2 класса, кто-нибудь знает почему? AM я использую неправильный атрибут? Кажется, это игнорируется: -)

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();
}

Ответы

Ответ 1

Украсьте свои два класса с помощью 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();
}

Это приведет к созданию двух разных FQDN для двух классов RelationShip:

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

Ответ 2

[XmlRoot] используется только для корневого элемента документа. Вы хотите использовать [XmlType] для других типов.

Кроме того, вам не нужно [Serializable]. Сериализатор XML игнорирует его.

Ответ 3

Вы также должны украшать поля, например:

[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();
}

Ответ 4

У меня была эта проблема с двумя сторонними веб-службами, которые я потреблял в одном приложении. Как ни странно, динамическое время исполнения было прекрасным (хотя это заняло 2 минуты), но sgen.exe расстроился.

Решение заключалось в использовании svcutil.exe...

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

Затем используйте csc.exe для его компиляции.