忽略属性(XML)序列化

时间:2014-06-12 07:42:50

标签: c# xml serialization xml-serialization deserialization

我的课程有一些我不想(XML)序列化的属性。

示例:

public class MyClass
{
    private TimeSpan executionTime = TimeSpan.FromSeconds(0.0);

    public TimeSpan ExecutionTime
    {
        get {return executionTime;}
        set {executionTime = value;}
    }

    public double ExecutionTimeSeconds
    {
        get {return executionTime.TotalSeconds;}
        set {executionTime = TimeSpan.FromSeconds(value);}
    }
}

除此之外,这是一些无用的代码,您不希望这两种方法都被(反)序列化。当多个公共可读和可写属性相互影响时,会出现此问题。

如何防止这种情况?

1 个答案:

答案 0 :(得分:1)

二进制序列化和xml序列化之间存在差异

  • 二进制序列化(de)序列化所有(公共和非公共)字段
  • 标准XML序列化(de)序列化公共可读和可写属性

二进制序列化

您的示例类不会在二进制序列化中出现问题。如果你的类有两个相互关联的字段,它甚至不会导致问题:

class BinaraySerializationProblem
{
    private int x = 0;
    private int doubleX = 0;
    // etc. Methods that change x and doubleX
}

只要你处理x和doubleX之间的关系,二进制序列化就不会有问题。

但是,出于效率原因,有时您不希望序列化某些项目:

[Serializable]
class MyImage
{
    private string imageFileName = null;
    private BitMap loadedImage = null;
    // etc. Methods to change imageFileName and load the image
}

序列化时,您可能不想保存位图,因为可以通过读取文件来重新创建位图。在这种情况下,您将属性[NonSerialized]添加到字段(不是属性!)

[Serializable]
class MyImage
{
    private string imageFileName = null;

    [NonSerialized]
    private BitMap loadedImage = null;
    // etc. Methods to change imageFileName and load the image
}
[Serializable]和[NonSerialized]可在命名空间System

中找到

XML序列化

保存XML时,所有公共可读和可写属性的所有ToString()值都会被序列化。

因此,在XML的情况下,将保存ExecutionTime和ExecutionTimeSeconds的值。

如果您不希望序列化属性,请使用属性[XmlIgnore]。按如下方式更改课程:

[Serializable]
public class MyClass
{
    private TimeSpan executionTime = TimeSpan.FromSeconds(0.0);

    [System.Xml.Serialization.XmlIgnore] 
    public TimeSpan ExecutionTime
    {
        get {return executionTime;}
        set {executionTime = value;}
    }

    public double ExecutionTimeSeconds
    {
        get {return executionTime.TotalSeconds;}
        set {executionTime = TimeSpan.FromSeconds(value);}
    }
}

这导致属性ExecutionTime的值未被序列化,只有ExecutionTimeSeconds的值为。

顺便说一句,我注意到TimeSpan类不是XML可序列化的,所以如果你需要xml序列化一个时间跨度,有必要添加[XmlIgnore]属性并创建一个额外的属性来保存TimeSpan以可序列化的格式(秒/毫秒/小时/等)。