使用.Net 4中的XmlSerializer,我试图序列化一个包含两个具有相同名称但名称不同的类的类。
[XmlInclude(typeof(MyNamespace1.MyClass))]
[XmlInclude(typeof(MyNamespace2.MyClass))]
public class SuperInfo
{
public MyNamespace1.MyClass A{ get; set; }
public MyNamespace2.MyClass B{ get; set; }
}
事实证明,序列化程序无法区分我使用相同名称的这两个类。例外情况显示:
'Types MyNamespace1.MyClass'和'MyNamespace2.MyClass'都使用来自命名空间''的XML类型名称'MyClass'。使用XML属性为类型指定唯一的XML名称和/或命名空间。
我找到了一个解决方案in this thread,包括用这样的属性装饰同名类:
[XmlType("BaseNamespace1.MyClass")]
[XmlType("BaseNamespace2.MyClass")]
但我不允许这样做,因为在我的情况下,这些类来自自动生成的代理到Web服务。
你有解决方案吗?
答案 0 :(得分:2)
您可以尝试Newtonsoft.Json将对象转换为XML,如下所示
using System.Xml.Serialization;
using Newtonsoft.Json;
namespace SoTestConsole
{
[XmlInclude(typeof(TestClassLibrary.Class1))]
[XmlInclude(typeof(TestClassLibrary1.Class1))]
public class SuperInfo
{
public TestClassLibrary.Class1 A { get; set; }
public TestClassLibrary1.Class1 B { get; set; }
}
class Program
{
static void Main(string[] args)
{
var obj = new SuperInfo()
{
A = new TestClassLibrary.Class1() { MyProperty = "test1" },
B = new TestClassLibrary1.Class1() { MyProperty = "test2" }
};
// Error case
//XmlSerializer xmlSerializer = new XmlSerializer(typeof(SuperInfo));
// but below will work
var json = JsonConvert.SerializeObject(obj);
var xDoc = JsonConvert.DeserializeXNode(json, "SuperInfo");
}
}
}
输出
<SuperInfo>
<A>
<MyProperty>test1</MyProperty>
</A>
<B>
<MyProperty>test2</MyProperty>
</B>
</SuperInfo>
答案 1 :(得分:1)
我认为您可以为每个代理类创建一个分部类,并在每个代理类中添加XmlType标头。
答案 2 :(得分:0)
在我失去足够的时间之后,我可以用这句话结束(这几乎是不可能的)(没有什么是不可能的)。我也试过了ISerializable接口实现。