Ошибка сериализации XML: оба типа используют имя типа XML «Отношение» из пространства имен «» - PullRequest
13 голосов
/ 11 февраля 2011

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

{"Типы" SiteServer.Relationship "и" LocalServer.Relationship "используютИмя типа XML, 'Relationship', from namespace ''. Используйте атрибуты 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 ]

13 голосов
/ 11 февраля 2011

Украсьте свои два класса 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
6 голосов
/ 11 февраля 2011

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

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

1 голос
/ 11 февраля 2011

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

[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();
}
0 голосов
/ 21 ноября 2017

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

Решение было использовать svcutil.exe ...

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

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

...