我目前正在为我的DataSet使用包装类,以实现自定义序列化.我想使用DataContractSerializer(更像是必须使用它)但仍然支持自定义序列化.问题是,[DataContract]和[Serializable]属性似乎并没有很好地相处...我怎么能覆盖序列化,并支持BOTH DataContract和ISerializable序列化?包装器DataSet类的代码带到这里:
[Serializable()]
[System.Runtime.InteropServices.ComVisible(false)]
public class TestDatasetWrapper : TestDataSet, ISerializable
{
public TestDatasetWrapper()
: base()
{}
protected TestDatasetWrapper(SerializationInfo info, StreamingContext context)
{
SerializationHelper.DeserializeTypedDataSet(info, this);
}
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
SerializationHelper.AddTypedDataSetObjectData(info, this);
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我已经看过几个带有serializable属性的例子,如下所示:
[Serializable()]
public class sampleClass
{
public int Property1{ get; set; }
public string Proerty2{ get; set; }
public sampleClass() { }
public sampleClass(int pr1, int pr2)
{
pr1 = pr1;
Name = pr2.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
我从来没有很好地理解它是如何工作的,但是从msdn:
序列化允许开发人员保存对象的状态并根据需要重新创建它,提供对象的存储以及数据交换.通过序列化,开发人员可以执行诸如通过Web服务将对象发送到远程应用程序,将对象从一个域传递到另一个域,将对象作为XML字符串传递到防火墙,或者维护安全性或特定于用户的操作跨应用程序的信息
但问题是,在我的代码示例中,我认为没有用处.只是一个用于从数据库中检索数据的对象,没什么特别的.何时使用以及何时不使用序列化有什么其他用途.例如,我应该总是使用序列化,因为它更安全吗?是这样慢吗?
更新:谢谢你们所有的好答案
我很难理解对ISerializable界面的需求......我想我在这个主题中缺少一些非常重要的东西,所以如果有人能帮我一把,我会很感激.
这非常有效 -
[Serializable]
class Student
{
public int age;
public string name;
public Student()
{
age = 0;
name = null;
}
}
class Program
{
public static void Main()
{
Stream stream = File.Open("Test123.txt", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
Student s1 = new Student();
s1.name = "Peter";
s1.age = 50;
bf.Serialize(stream, s1);
stream.Close();
Stream stream2 = File.Open("Test123.txt", FileMode.Open);
Student s2 = (Student)bf.Deserialize(stream2);
Console.WriteLine(s2.age);
}
Run Code Online (Sandbox Code Playgroud)
它没有实现ISerializable而且没有覆盖GetObjectData().怎么会这样?那么界面有什么用?
谢谢.