【问题标题】:Issue serializing / deserializing a custom object with double values问题序列化/反序列化具有双值的自定义对象
【发布时间】:2012-11-06 18:19:38
【问题描述】:

试图反序列化这个类的一个实例

[Serializable]
public class InstalledMeter : ISerializable 
{
    public string Description { get; set; }

    public double Latitude { get; set; }
    public double Longitude { get; set; }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("Description", Description);
        info.AddValue("Latitude", Latitude);
        info.AddValue("Longitude", Longitude);
    }
}

实例:

new InstalledMeter {Description = "Something", Latitude = 0.0, Longitude = 0.0};

我的序列化方法

public static class SerializeString
{
    public static string SerializeObject<T>(this T toSerialize)
    {
        var xmlSerializer = new XmlSerializer(toSerialize.GetType());
        var textWriter = new StringWriter();

        xmlSerializer.Serialize(textWriter, toSerialize);
        return textWriter.ToString();
    }

    public static T XmlDeserializeFromString<T>(this string objectData)
    {
        return (T)XmlDeserializeFromString(objectData, typeof(T));
    }

    public static object XmlDeserializeFromString(string objectData, Type type)
    {
        var serializer = new XmlSerializer(type);
        object result;

        using (TextReader reader = new StringReader(objectData))
        {
            result = serializer.Deserialize(reader);
        }

        return result;
    }
}

但是当我序列化对象时,它具有这些值

【问题讨论】:

  • 您在这里遇到文化问题吗?似乎您提供了以点作为小数分隔符的双精度值,结果显示逗号作为小数分隔符。
  • 您没有显示要反序列化的 xml。显示的经度值是双精度的 Epsilon 值。在监视窗口上执行 double.Epsilon 并看看你得到了什么。发布您的 xml 源代码,我们可能能够准确地找出导致此问题的源代码中的内容。 .
  • 如果我将类型更改为 int 它可以工作,但我没有 XML 源,我只是序列化 InstalledMeter {Description = "Something", Latitude = 0.0, Longitude = 0.0};到带有 SerializeObject 的字符串,将其解析为字符串并反序列化它,是的 Epsilon = 4,94065645841247E-324
  • 如果我将 InstalledMeter 中的属性更改为字符串,然后只执行 .ToString() 和 Convert.ToDouble() 那么它工作正常,但这只是非常丑陋的代码......
  • 在您的代码示例中,字符串installedMeter 的值是多少?

标签: c# .net


【解决方案1】:

(根据您之前的问题猜测答案 - Error passing parameters to mvvmcross viewmodels

如果你在 MvvmCross 中这样做,那么我会完全避免这个 xml 问题,只使用 JSON 序列化

  var jsonText = JSONConvert.SerializeObject(installedMeter);

  var installedMeter = JSONConvert.DeserializeObject<InstalledMeter>(jsonText);

只使用:

    public class InstalledMeter
    {
        public string Description { get; set; }
        public double Latitude { get; set; }
        public double Longitude { get; set; }
    }

【讨论】:

  • 最终使用 IoC,创建了一个 SharedVariables 类,其顶部有一个接口,然后只制作需要它的不同 ViewModels 该接口的消费者,这样比在视图模型之间解析一些变量更好
  • 很好的解决方案 - 更易于维护、可重用和可扩展。
猜你喜欢
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多