C# .Net二进制序列化继承

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

在C#上下文中,我有一个被标记为可序列化的类B,它从一个未被标记为此的类a继承。我能找到一种方法来序列化B实例而不将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机制上的序列化。谢谢你的链接,这是非常有趣的好机制。谢谢你的链接,非常有趣