Ошибка 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 для его компиляции.