C# .Net二进制序列化继承
在C#上下文中,我有一个被标记为可序列化的类B,它从一个未被标记为此的类a继承。我能找到一种方法来序列化B实例而不将a标记为可序列化的吗?我认为如果您进行自定义序列化,这应该可以工作-即实现C# .Net二进制序列化继承,c#,inheritance,serialization,C#,Inheritance,Serialization,在C#上下文中,我有一个被标记为可序列化的类B,它从一个未被标记为此的类a继承。我能找到一种方法来序列化B实例而不将a标记为可序列化的吗?我认为如果您进行自定义序列化,这应该可以工作-即实现ISerializable。但这不是一个好的选择: using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; class A
ISerializable
。但这不是一个好的选择:
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
class A {
public int Foo { get; set; }
}
[Serializable]
class B : A, ISerializable {
public string Bar { get; set; }
public B() { }
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) {
info.AddValue("Foo", Foo);
info.AddValue("Bar", Bar);
}
private B(SerializationInfo info, StreamingContext context) {
Foo = info.GetInt32("Foo");
Bar = info.GetString("Bar");
}
}
static class Program {
static void Main() {
BinaryFormatter bf = new BinaryFormatter();
B b = new B { Foo = 123, Bar = "abc" }, clone;
using (MemoryStream ms = new MemoryStream()) {
bf.Serialize(ms, b);
ms.Position = 0;
clone = (B)bf.Deserialize(ms);
}
Console.WriteLine(clone.Foo);
Console.WriteLine(clone.Bar);
}
}
您只想存储数据吗?我还可以想到一种使用protobuf net(而不是我假设您正在使用的BinaryFormatter)来实现这一点的方法。我认为如果您进行自定义序列化,这应该可以实现—即实现ISerializable
。但这不是一个好的选择:
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
class A {
public int Foo { get; set; }
}
[Serializable]
class B : A, ISerializable {
public string Bar { get; set; }
public B() { }
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) {
info.AddValue("Foo", Foo);
info.AddValue("Bar", Bar);
}
private B(SerializationInfo info, StreamingContext context) {
Foo = info.GetInt32("Foo");
Bar = info.GetString("Bar");
}
}
static class Program {
static void Main() {
BinaryFormatter bf = new BinaryFormatter();
B b = new B { Foo = 123, Bar = "abc" }, clone;
using (MemoryStream ms = new MemoryStream()) {
bf.Serialize(ms, b);
ms.Position = 0;
clone = (B)bf.Deserialize(ms);
}
Console.WriteLine(clone.Foo);
Console.WriteLine(clone.Bar);
}
}
您只想存储数据吗?我还可以想到一种使用protobuf net(而不是我假设您正在使用的BinaryFormatter)来实现这一点的方法。尝试使用序列化代理。杰夫·里克特的《尼斯》尝试使用序列化代理。Nice by Jeff Richter我认为您只需要在类B中实现iSerializable,这将允许您控制类的序列化。如果您要序列化B,您还必须序列化其超类A的状态。为什么不想将A标记为可序列化?A是另一个项目的一部分,我没有编辑权限。我认为您只需要在类B中实现iSerializable,这将允许您控制类的序列化。如果要序列化B,还必须序列化其超类A的状态。为什么不把A标记为可序列化?A是另一个项目的一部分,我无权编辑。谢谢你的回答。没错,我用的是BynaryFormatter。需要存储对象的数据。关于protobuf net,使用它代替BinaryFormatter有什么好处?有什么例子吗?a:更快更小()b:平台/语言独立()c:不特定于元数据(可以重命名字段、移动/重命名类型等:)。简介:请注意,简介没有涉及继承,protobuf net中的继承支持是一种定制,不会直接映射到Java/C++/etc:他们会看到数据,但不会作为继承(嘿,我没有设计wire格式…)一个小的潜在问题:如果可能的话,您可能希望将基类A标记为密封的,以防以后有人在其上实现自定义序列化程序。这将中断B上的序列化。谢谢您的回答。没错,我用的是BynaryFormatter。需要存储对象的数据。关于protobuf net,使用它代替BinaryFormatter有什么好处?有什么例子吗?a:更快更小()b:平台/语言独立()c:不特定于元数据(可以重命名字段、移动/重命名类型等:)。简介:请注意,简介没有涉及继承,protobuf net中的继承支持是一种定制,不会直接映射到Java/C++/etc:他们会看到数据,但不会作为继承(嘿,我没有设计wire格式…)一个小的潜在问题:如果可能的话,您可能希望将基类A标记为密封的,以防以后有人在其上实现自定义序列化程序。这将打破B.Nice机制上的序列化。谢谢你的链接,这是非常有趣的好机制。谢谢你的链接,非常有趣