C# 自定义集合类中的反序列化
我有一个自定义集合,它向“ArrayList”类添加了功能 下面是该类的一些代码:C# 自定义集合类中的反序列化,c#,.net,serialization,stream,C#,.net,Serialization,Stream,我有一个自定义集合,它向“ArrayList”类添加了功能 下面是该类的一些代码: [Serializable] class Coll : ArrayList { public void Save(string path) { BinaryFormatter formatter = new BinaryFormatter(); FileStream fsOut = ne
[Serializable]
class Coll : ArrayList
{
public void Save(string path)
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream fsOut = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
formatter.Serialize(fsOut, this);
fsOut.Dispose();
}
}
我现在尝试反序列化一个文件,并用文件的内容填充集合。基本上与我的Save(字符串路径)
方法相反
到目前为止,我得到的是:
public void Read(string path)
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream fsIn = new FileStream(path, FileMode.Open, FileAccess.Read);
formatter.Deserialize(fsIn);
fsIn.Dispose();
}
我应该如何用反序列化的内容填充集合?该方法创建一个新对象,用流中的数据初始化它并返回它。因此,您应该使用返回值并将其用作新的
ArrayList
对象。因此,Read
方法进入一个静态方法,或者——正如diggingforfire建议的那样——进入另一个类。该方法创建一个新对象,用流中的数据初始化它并返回它。因此,您应该使用返回值并将其用作新的ArrayList
对象。因此,Read
方法进入了一个静态方法,或者——正如diggingforfire建议的那样——进入另一个类。BinaryFormatter
不支持将序列化到现有对象中。您可以将其反序列化为一个新的列表-只需将其设置为一个静态
方法并返回值即可
其他想法:
- 除非您在.NET1.1中,否则不要使用
:ArrayList
会更好List
- 不需要子类;一种扩展方法就足够了
- 我不推荐使用
进行此操作。。。或者别的什么真的BinaryFormatter
二进制格式化程序
不支持将序列化为现有对象。您可以将其反序列化为一个新的列表-只需将其设置为一个静态
方法并返回值即可
其他想法:
- 除非您在.NET1.1中,否则不要使用
:ArrayList
会更好List
- 不需要子类;一种扩展方法就足够了
- 我不推荐使用
进行此操作。。。或者别的什么真的BinaryFormatter
反序列化的返回值呢?
?这是我一直坚持的部分。如何从该输出填充数组?从集合中取出(反)序列化位。然后将整个集合反序列化为一个整体(尽管您可以使用扩展方法来实现相同的语法),您可以执行类似Coll other=formatter的操作;foreach(var-item-in-other){this.Add(item);}但是它带来了很大的开销,并且每个定义都是未分配的。最好在集合之外声明序列化逻辑,或者使Read方法静态返回格式化程序的结果。反序列化(fsIn)强制转换为coll。为什么不使用反序列化的返回值呢?这是我一直坚持的部分。如何从该输出填充数组?从集合中取出(反)序列化位。然后将整个集合反序列化为一个整体(尽管您可以使用扩展方法来实现相同的语法),您可以执行类似Coll other=formatter的操作;foreach(var-item-in-other){this.Add(item);}但是它带来了很大的开销,并且每个定义都是未分配的。最好在collectionOr之外声明序列化逻辑,或者使Read方法成为静态的,从formatter返回结果。反序列化(fsIn)强制转换为coll。从技术上讲,可以使用序列化代理将序列化转换为现有对象。但这样做可能不是一个好主意。从技术上讲,您可以使用序列化代理将其序列化为现有对象。但这样做可能不是一个好主意。