反序列化 return 空对象,使用 Filestream 和 Binaryformatter
Deserializtion return empty object, using Filestream and Binary Formatter
问题是反序列化时我在回购中得到零计数(没有任何错误)
[Serializable]
class RegexRepository : Dictionary<string, string>
{
public RegexRepository()
{
//this.Add("All", "ALL");
//this.Add("Name", @"Name:(?<data>[\s\w]+)Email");
//this.Add("Email", @"Email:(?<data>[\w\s@]+\.com)");
//this.Add("Phone Number", "Phone:(?<data>\d+)");
}
protected RegexRepository(SerializationInfo info, StreamingContext context)
{
}
private static RegexRepository repo = new RegexRepository();
public static RegexRepository Instance
{
get
{
if (repo == null)
{
repo = new RegexRepository();
}
return repo;
}
}
string FileName = AppDomain.CurrentDomain.BaseDirectory + "BinaryFile.dat";
public void Serialize()
{
using (FileStream ms = new FileStream(FileName, FileMode.OpenOrCreate))
{
var bf = new BinaryFormatter();
bf.Serialize(ms, this);
}
}
public void Deserialize()
{
if (System.IO.File.Exists(FileName))
{
using (FileStream ms = new FileStream(FileName, FileMode.Open))
{
var bf = new BinaryFormatter();
repo = (RegexRepository)bf.Deserialize(ms);
//Here i get zero count in repo, checked while debugging
}
}
}
}
我看到BinaryFile.dat不是空的,我可以看到里面有一些记录。请帮助我
您需要从流式构造函数中调用基本构造函数:
protected RegexRepository(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
此外,FileName
可能不应该是一个字段,您在 class 中为其分配内存,这不是必需的。相反,静态 属性 似乎更有意义:
static string FileName
{
get
{
return AppDomain.CurrentDomain.BaseDirectory + "BinaryFile.dat";
}
}
当基础 class 实现 ISerializable 时,仅在派生 class 上添加 [Serializable] 属性是不够的。您的派生 class 需要:
- 从(当前为空的)序列化构造函数中调用 base(info, context)。
- 填写您的序列化构造函数以从 SerializationInfo 中读取任何实例值。
- 创建一个
GetObjectData(SerializationInfo info, StreamingContext context)
覆盖以将派生成员写入 SerializationInfo(并调用基础 class' 实现)。
运行 对你的 class 进行 VS 代码分析会发现问题。
问题是反序列化时我在回购中得到零计数(没有任何错误)
[Serializable]
class RegexRepository : Dictionary<string, string>
{
public RegexRepository()
{
//this.Add("All", "ALL");
//this.Add("Name", @"Name:(?<data>[\s\w]+)Email");
//this.Add("Email", @"Email:(?<data>[\w\s@]+\.com)");
//this.Add("Phone Number", "Phone:(?<data>\d+)");
}
protected RegexRepository(SerializationInfo info, StreamingContext context)
{
}
private static RegexRepository repo = new RegexRepository();
public static RegexRepository Instance
{
get
{
if (repo == null)
{
repo = new RegexRepository();
}
return repo;
}
}
string FileName = AppDomain.CurrentDomain.BaseDirectory + "BinaryFile.dat";
public void Serialize()
{
using (FileStream ms = new FileStream(FileName, FileMode.OpenOrCreate))
{
var bf = new BinaryFormatter();
bf.Serialize(ms, this);
}
}
public void Deserialize()
{
if (System.IO.File.Exists(FileName))
{
using (FileStream ms = new FileStream(FileName, FileMode.Open))
{
var bf = new BinaryFormatter();
repo = (RegexRepository)bf.Deserialize(ms);
//Here i get zero count in repo, checked while debugging
}
}
}
}
我看到BinaryFile.dat不是空的,我可以看到里面有一些记录。请帮助我
您需要从流式构造函数中调用基本构造函数:
protected RegexRepository(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
此外,FileName
可能不应该是一个字段,您在 class 中为其分配内存,这不是必需的。相反,静态 属性 似乎更有意义:
static string FileName
{
get
{
return AppDomain.CurrentDomain.BaseDirectory + "BinaryFile.dat";
}
}
当基础 class 实现 ISerializable 时,仅在派生 class 上添加 [Serializable] 属性是不够的。您的派生 class 需要:
- 从(当前为空的)序列化构造函数中调用 base(info, context)。
- 填写您的序列化构造函数以从 SerializationInfo 中读取任何实例值。
- 创建一个
GetObjectData(SerializationInfo info, StreamingContext context)
覆盖以将派生成员写入 SerializationInfo(并调用基础 class' 实现)。
运行 对你的 class 进行 VS 代码分析会发现问题。