我的类有一些我不想被 (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/