【问题标题】:Double properties will not be serialized to XML双属性不会被序列化为 XML
【发布时间】: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


【解决方案1】:

要定义序列化的精确程度,您应该手动进行。

[XmlIgnore]
public double Price { get;set; }

[XmlElement("Price")]
public string PriceString {
    get {return Price.ToString();}
    set {Price = double.Parse(value);}
}

来自http://bytes.com/topic/c-sharp/answers/768555-serializable-double-precision

【讨论】:

  • 谢谢,我们也试过了,它可以工作,作为临时解决方法,我们手动序列化对象。问题不在于我们没有获得正确的精度,而是我们根本没有获得该属性(可能 ToString() 在序列化引擎内失败)。我非常想知道这种奇怪行为的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
相关资源
最近更新 更多