C#序列化特性继承问题
测试对象 ‘BinaryFormatter’ 'XmlSerializer'
结论:BinaryFormatter:父类有序列化标签时,子类序列化也需要添加序列化标签
XmlSerializer:父类有序列化标签时,子类序列化可以不用添加序列化标签
定义父类
[Serializable]
public class TestSerializer
{
public string Name { set; get; }
public string Value { set; get; }
}
定义子类
[Serializable]
public class SubTestSerializer : TestSerializer
{
public int Index { set; get; } = 0;
public bool Enabled { set; get; } = false;
}
序列化测试
- 声明对象
SubTestSerializer seri = new SubTestSerializer() { Name = "T1", Value = "V1" ,Index=100,Enabled=true};
- BinaryFormatter测试
string str = "";
BinaryFormatter xmlSerializer = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
xmlSerializer.Serialize(stream, seri);
str = Convert.ToBase64String(stream.ToArray());
}
BinaryFormatter xmlSerializer1 = new BinaryFormatter();
byte[] buffer = Convert.FromBase64String(str);
using (MemoryStream stream1 = new MemoryStream(buffer))
{
var seri1 = (SubTestSerializer)xmlSerializer1.Deserialize(stream1);
}
当子类无[Serializable]特性时报错,提示缺少序列化标记,序列化失败,说明BinaryFormatter只能针对具有[Serializable]特性的对象序列化,当父类有[Serializable]标记时,子类也需要添加。
- XmlSerializer测试
string str="";
XmlSerializer xmlSerializer2 = new XmlSerializer(typeof(SubTestSerializer));
using (MemoryStream stream = new MemoryStream())
{
xmlSerializer2.Serialize(stream, seri);
str = Convert.ToBase64String(stream.ToArray());
}
XmlSerializer xmlSerializer3 = new XmlSerializer(typeof(SubTestSerializer));
byte[] buffer2 = Convert.FromBase64String(str);
using (MemoryStream stream1 = new MemoryStream(buffer2))
{
var seri1 = (SubTestSerializer)xmlSerializer3.Deserialize(stream1);
}
当子类无[Serializable]特性时,可以正常执行序列化操作。所以XmlSerializer序列化对象时,父类有[Serializable]特性时,子类可以不添加。
如果说,岁月是一首歌,那么我们便是歌者,纵使孤独,仍会固执高歌;如果说,岁月是一段旅程,那么我们便是行者,且行且梦,让生命丰盈。