继承dataset的问题,请高手回答

时间:2022-05-05 14:40:12
using System;
using System.Data;
using System.Runtime.Serialization;

namespace Manage
{
[System.ComponentModel.DesignerCategory("Code")]
[Serializable]
public class Info:DataSet
{
public Info()
{

}
private Info(SerializationInfo info, StreamingContext context) : base(info, context)
{  }


}
}


1.为什么要加上[System.ComponentModel.DesignerCategory("Code")],[Serializable]这两个属性,这两个属性是什么意思?

2.private Info(SerializationInfo info, StreamingContext context) : base(info, context)
这句语句是什么意思,为什么要这么写?

8 个解决方案

#1


1,Info类所属设计器类别,Serializable注明此类是可序列化的类;
2,重载构造函数,...: base(info, context)表示调用基类的构造函数。

#2


1)System.ComponentModel 命名空间提供用于实现组件和控件运行时和设计时行为的类。此命名空间包括用于实现属性和类型转换器、绑定到数据源以及授权组件的基类和接口,其中DesignerCategoryAttribute 指定类设计器属于某一类别;
任何可以序列化的类都必须用 SerializableAttribute 进行标记,序列化是将对象状态转换为可保持或传输的格式的过程(二进制流或者soap流),与序列化相对的是反序列化,它将流转换为对象。

#3


Serializable  该类可序列化,因为webservice通过soap传递数据时,需要可序列化的类作为载体

base(info, context) 先调用基类的构造函数,然后执行自身构造函数

#4


1,Info类所属设计器类别,Serializable注明此类是可序列化的类;
2,重载构造函数,...: base(info, context)表示调用基类的构造函数。

问1.如果不写,就不可以序列化了吗?
  2.我看在很多序列化代码中都有...: base(info, context),我知道调用基类的构造函数,但是写在这里有什么用处?

#5


DesignerCategoryAttribute:
ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemcomponentmodeldesignercategoryattributeclasstopic.htm
指定类设计器属于某一类别。可视化设计器可以使用设计器类别通知开发环境将要实现的设计器类型。如果没有为某个类提供任何设计器类别,开发环境可能允许设计此类,也可能不允许。可以创建任何名称的类别。
当用此属性标记类时,它被设置为常数成员。当要在代码中检查此特性的值时,必须指定常数成员。

SerializableAttribute:
ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemserializableattributeclasstopic.htm
指示一个类可以序列化。将 SerializableAttribute 属性应用于一个类型可指示该类型的实例可以序列化。如果正在序列化的对象图中的任何类型未应用 SerializableAttribute 属性,公共语言运行库则会引发 SerializationException。
即使该类也会实现 ISerializable 接口来控制序列化进程,仍要应用 SerializableAttribute 属性。
默认情况下,类型中由 SerializableAttribute 标记的所有公共和私有字段都会进行序列化,除非该类型实现 ISerializable 接口来重写序列化进程。默认的序列化进程会排除用 NonSerializedAttribute 属性标记的字段。如果可序列化类型的字段包含指针、句柄或其他某些针对于特定环境的数据结构,并且不能在不同的环境中以有意义的方式重建,则最好将 NonSerializedAttribute 属性应用于该字段。

private Info(SerializationInfo info, StreamingContext context) : base(info, context){}
表示调用基类的构造函数

#6


1.如果不写,就不可以序列化了吗?
--------------------------------------
这样看基类是否被指定[SerializableAttribute]特性,如果有,则可以序列化,但将以基类指定的方式进行序列化,如果没有,则不能被序列化。


  2.我看在很多序列化代码中都有...: base(info, context),我知道调用基类的构造函数,但是写在这里有什么用处。
----------------------------------------
如果不写,实例化时将不能调用该构造函数。
如:
public class a
{
public a(){}
public a(int p){}
}

public class b : a
{
public b(int p):base(p){}
}

public class c : a
{
}

public class test
{
public void testBase()
{
a t_a = new a(0);
b t_b = new b(0);//成功
c t_c = new c(0);//编译失败
}
}

实例化时:

#7


我继承的是dataset,可以直接写...: base(info, context)这个构造函数,是不是,我定义构造函数,基本就会声明一个这样的基类构造函数

#8


我继承的是dataset,可以直接写...: base(info, context)这个构造函数,是不是,我定义构造函数,基本就会声明一个这样的基类构造函数
---------------------------------------
只要你想让子类访问基类的构造函数,就要这样写

#1


1,Info类所属设计器类别,Serializable注明此类是可序列化的类;
2,重载构造函数,...: base(info, context)表示调用基类的构造函数。

#2


1)System.ComponentModel 命名空间提供用于实现组件和控件运行时和设计时行为的类。此命名空间包括用于实现属性和类型转换器、绑定到数据源以及授权组件的基类和接口,其中DesignerCategoryAttribute 指定类设计器属于某一类别;
任何可以序列化的类都必须用 SerializableAttribute 进行标记,序列化是将对象状态转换为可保持或传输的格式的过程(二进制流或者soap流),与序列化相对的是反序列化,它将流转换为对象。

#3


Serializable  该类可序列化,因为webservice通过soap传递数据时,需要可序列化的类作为载体

base(info, context) 先调用基类的构造函数,然后执行自身构造函数

#4


1,Info类所属设计器类别,Serializable注明此类是可序列化的类;
2,重载构造函数,...: base(info, context)表示调用基类的构造函数。

问1.如果不写,就不可以序列化了吗?
  2.我看在很多序列化代码中都有...: base(info, context),我知道调用基类的构造函数,但是写在这里有什么用处?

#5


DesignerCategoryAttribute:
ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemcomponentmodeldesignercategoryattributeclasstopic.htm
指定类设计器属于某一类别。可视化设计器可以使用设计器类别通知开发环境将要实现的设计器类型。如果没有为某个类提供任何设计器类别,开发环境可能允许设计此类,也可能不允许。可以创建任何名称的类别。
当用此属性标记类时,它被设置为常数成员。当要在代码中检查此特性的值时,必须指定常数成员。

SerializableAttribute:
ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemserializableattributeclasstopic.htm
指示一个类可以序列化。将 SerializableAttribute 属性应用于一个类型可指示该类型的实例可以序列化。如果正在序列化的对象图中的任何类型未应用 SerializableAttribute 属性,公共语言运行库则会引发 SerializationException。
即使该类也会实现 ISerializable 接口来控制序列化进程,仍要应用 SerializableAttribute 属性。
默认情况下,类型中由 SerializableAttribute 标记的所有公共和私有字段都会进行序列化,除非该类型实现 ISerializable 接口来重写序列化进程。默认的序列化进程会排除用 NonSerializedAttribute 属性标记的字段。如果可序列化类型的字段包含指针、句柄或其他某些针对于特定环境的数据结构,并且不能在不同的环境中以有意义的方式重建,则最好将 NonSerializedAttribute 属性应用于该字段。

private Info(SerializationInfo info, StreamingContext context) : base(info, context){}
表示调用基类的构造函数

#6


1.如果不写,就不可以序列化了吗?
--------------------------------------
这样看基类是否被指定[SerializableAttribute]特性,如果有,则可以序列化,但将以基类指定的方式进行序列化,如果没有,则不能被序列化。


  2.我看在很多序列化代码中都有...: base(info, context),我知道调用基类的构造函数,但是写在这里有什么用处。
----------------------------------------
如果不写,实例化时将不能调用该构造函数。
如:
public class a
{
public a(){}
public a(int p){}
}

public class b : a
{
public b(int p):base(p){}
}

public class c : a
{
}

public class test
{
public void testBase()
{
a t_a = new a(0);
b t_b = new b(0);//成功
c t_c = new c(0);//编译失败
}
}

实例化时:

#7


我继承的是dataset,可以直接写...: base(info, context)这个构造函数,是不是,我定义构造函数,基本就会声明一个这样的基类构造函数

#8


我继承的是dataset,可以直接写...: base(info, context)这个构造函数,是不是,我定义构造函数,基本就会声明一个这样的基类构造函数
---------------------------------------
只要你想让子类访问基类的构造函数,就要这样写