为了账号安全,请及时绑定邮箱和手机立即绑定

创建另一个类的后代

创建另一个类的后代

C#
手掌心 2021-06-02 13:37:04
我想根据以下内容创建一个新类:    [Serializable()]    public class Class_A : ISerializable    {        public int DISP_SEGS { get; set; }        //Default constructor        public Class_A()        {            //        }        //Deserialization constructor    //If I add virtual to this I get an error        public Class_A(SerializationInfo info, StreamingContext ctxt)        {            foreach (PropertyInfo PI in this.GetType().GetProperties()) PI.SetValue(this, info.GetValue(PI.Name, PI.PropertyType));        }        //Serialization function        public void GetObjectData(SerializationInfo info, StreamingContext ctxt)        {            foreach (PropertyInfo PI in this.GetType().GetProperties()) info.AddValue(PI.Name, PI.GetValue(this));        }    }我希望“Class_B”使用序列化和反序列化函数的功能。不想创建一个全新的类并复制所有代码,这些代码将在基础中。我希望能够创建一个 Class_B 对象,然后调用:    Class_B cb = new Class_B();...    bformatter.Serialize(stream, cb);...    cb = (Class_B)bformatter.Deserialize(stream);
查看完整描述

3 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

按照建议,我从 Binaryformatter 切换到 Protobuf。之后,一些问题,我已经得到了它的工作。所以,我以一种新的格式回到我原来的问题。


我有一个基类,想从它创建几个不同的类。我看到了,您应该使用 Protobufs ProtoInclude 属性。但是,好像落后了。它说,我的基类必须知道派生类型。


    [ProtoContract]

    [ProtoInclude(7, typeof(SomeDerivedType))]

    class SomeBaseType {...}


    [ProtoContract]

    class SomeDerivedType {...}

这是我派生的独立课程。所以,它需要是通用的。


    [ProtoContract]

    public class grid

    {

    }

所以,我需要从中得出。


    [ProtoContract]

    public class Class_A : grid

    {

    }  


    [ProtoContract]

    public class Class_B : grid

    {

    }

我理解,将 ProtoInclude 放在 Class_A 和 Class_B 上没有任何作用。不,如果它需要在网格类上。做到这一点的最佳方法是什么?因为,我正在打字,我想知道是否需要制作一个了解 Class_A 和 Class_B 的存根类?


    [ProtoContract]

    [ProtoInclude(7, typeof(Class_A))]

    [ProtoInclude(8, typeof(Class_B))]

    public class ProtoStub : grid

    {

    }


    [ProtoContract]

    public class Class_A : ProtoStub

    {

    }


    [ProtoContract]

    public class Class_B : ProtoStub

    {

    }

如果那行得通,那好吧。:( 但是,那只是多余的不必要的代码,这让我很伤心。


查看完整回答
反对 回复 2021-06-05
?
大话西游666

TA贡献1817条经验 获得超14个赞

我正在转换的内容:


    //My base class

    [ProtoContract]

    public class grid

    {

        [ProtoMember(1), CategoryAttribute("Grid Settings"), DescriptionAttribute("Number of Horizontal GRID Segments.")]

        public int HorizontalCells { get; set; }


        //more properties

    }


    //Our Protostub ... Originally, just for Stackoverflow.  But, I'm liking the name.

    [ProtoContract]

    [ProtoInclude(7, typeof(SKA_Segments))]

    public class ProtoStub : grid

    {

    }


    SKA_Segments seg_map;


    [ProtoContract]

    public class SKA_Segments : ProtoStub

    {

        public SKA_Segments()

        {

        }


        public override void Draw(Graphics Graf, Pen pencil)

        {

            base.Draw(Graf, pencil);

        }

    }


    //Serialization stuff

    seg_map.HorizontalCells = 1000;  //test property comes from the grid class


    //Need to stream all three of these into the one file

    //Serializer.SerializeWithLengthPrefix(stream, map, PrefixStyle.Base128, 1);

    //Serializer.SerializeWithLengthPrefix(stream, col_map, PrefixStyle.Base128, 1);

    Serializer.SerializeWithLengthPrefix(stream, seg_map, PrefixStyle.Base128, 1);


    //De-Serialization stuff

    //map = Serializer.DeserializeWithLengthPrefix<SKA_MAP>(stream, PrefixStyle.Base128, 1);

    //col_map = Serializer.DeserializeWithLengthPrefix<SKA_Collision>(stream, PrefixStyle.Base128, 1);

    seg_map = Serializer.DeserializeWithLengthPrefix<SKA_Segments>(stream, PrefixStyle.Base128, 1);



查看完整回答
反对 回复 2021-06-05
  • 3 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信