【发布时间】:2012-10-09 14:50:54
【问题描述】:
我们将一个对象序列化为xml:
public class Test: INotifyPropertyChanged
{
public virtual string Name {get; set;}
public virtual double TestScore {get; set;}
}
使用以下方法:
public static XElement ToXElement<T>(this object obj)
{
using (var memoryStream = new MemoryStream())
{
using (TextWriter streamWriter = new StreamWriter(memoryStream))
{
var xmlSerializer = new XmlSerializer(typeof(T));
xmlSerializer.Serialize(streamWriter, obj);
return XElement.Parse(Encoding.UTF8.GetString(memoryStream.ToArray()));
}
}
}
在以下上下文中(代码在 x64 上下文中运行,从 C++ 库中调用 .net 库):
XDocument rootElement = ...
Test test = new Test();
test.Name = "xxx";
test.TestScore= 1.0d;
rootElement.Add(test.ToXElement());
所有类型的属性(string、bool、long、int、ushort 等)都被序列化,除了 double 属性。一旦它们手动转换为其他东西(不是双重),它们就会被序列化。
Xml 看起来像这样:
<Root>
<Test>
<Name>xxx</Name>
</Test>
</Root>
双属性没有序列化有什么原因吗?
【问题讨论】:
-
你怎么知道 double 不是序列化的?你能提供输出吗?
-
当我运行这段代码时(除了在变量中捕获返回的
XElement,因为我没有rootElement),该元素同时包含名称和TestScore。 -
是的,这也是我所期待的,不幸的是,在我们的集合(项目、平台等)中,双重属性没有序列化。
-
你需要调试这个。我们知道,如果我们将上述所有代码放在一个新项目中,它会按预期工作。这样做,然后开始添加实际解决方案的更多方面,直到它崩溃。
-
这是您尝试使用的确切类,还是您有派生类型、显式接口实现等?尤其是显式接口实现不是公开的,因此不能被序列化。
标签: c# .net xml xml-serialization double