【问题标题】:C# Serialization practices of object with custom typesC#自定义类型对象的序列化实践
【发布时间】:2012-05-22 09:24:43
【问题描述】:

我创建了一些自定义类型,例如:

public class Temperature
{
    protected double _celcius;

    public Temperature(){}

    public Temperature(double celcius)
    {
        _celcius = celcius;
    }

    public double Celcius
    {
        //sets & returns temperature in Celcius
    }

    public double Fahrenheit
    {
        //sets & returns temperature in Fahrenheit
    }
}

还有类似的Mass

我还有一个自定义对象,例如Planet,它使用这些自定义类型作为属性。

[Serializable]
public class Planet
{
    public int PositionFromSun;
    public Mass Mass;
    public Temperature Temperature;
}

考虑到MassTemperature 将来可能会略有变化(例如,将Kelvin 添加到Temperature),在这种情况下序列化Planet 的最佳做法是什么?我是否应该让MassTemperature 继承自IQuantity 之类的自定义接口。

【问题讨论】:

  • 如果您使用 BinaryFormatter 进行序列化,则不必关心公共属性,它只会序列化字段(在您的情况下为 _celcius)。此外,如果您想保存数据以使用默认格式化程序不是一个好主意,因为它的“专有”格式和处理版本的方式。
  • 所以你是说只要我把_celcius 保留在那里,我对周围的代码做什么都没关系?能否请您扩展一下您的第二句话?
  • 是的,您可以根据需要添加任意数量的公共属性。为了比较,请在 SO 上查看这篇文章:stackoverflow.com/questions/1154198/…

标签: c# .net-3.5 binary-serialization


【解决方案1】:

请查看@Adriano 的comment。这正是我所需要的。

是的,您可以根据需要添加任意数量的公共属性。为了比较,请在 SO 上查看此帖子:What are the differences between the XmlSerializer and BinaryFormatter

【讨论】:

    【解决方案2】:

    二进制序列化对添加和删除类型的属性非常挑剔。如果您使用版本兼容的序列化程序(例如基于 xml 的序列化程序),您将能够可靠地在类版本之间进行序列化/反序列化。

    您可能需要考虑使用protobuf.Net 进行序列化 - 它成熟、非常快速且版本容错。

    【讨论】:

    • 谢谢,我去看看protobuf.Net!
    猜你喜欢
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多