c# - 忽略要 (XML) 序列化的属性

标签 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);}
    }
}

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

如何防止这种情况?

最佳答案

二进制序列化和xml序列化有区别

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

二进制序列化

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

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 时,所有公共(public)可读和可写属性的所有 ToString() 值都被序列化。

所以在 XML 的情况下,ExecutionTime 和 ExecutionTimeSeconds 的值都将被保存。

如果您不想序列化属性,请使用属性 [XmlIgnore]。按如下方式更改您的类(class):

[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以可序列化的格式(秒/毫秒/小时/等)。

关于c# - 忽略要 (XML) 序列化的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24178992/

相关文章:

c# - 带有元数据的 MEF GetExportedValue

c# - NLog 自定义日志级别值

c# - 添加(嵌入式资源)架构到 XmlReaderSettings 而不是文件名?

jquery - Javascript - 在隐藏字段中存储对象数组

java - SerialVersionUID 对于外部化类真的有意义吗?

java - 序列化对象丢失数据

c# - 在 C# 'switch' 语句中更改变量

c# - Excel DNA 打包问题

java - 没有名为缓存的 EntityManager 的持久性提供程序

java - 在Android Java中显示外语字符