项目中因为每个人有任务,分为代办和承办任务,所以需要把每个人的任务存到txt 中,所以用到了序列化,不要说存数据库,xml 这些话,存txt 是老大吩咐的,我也没办法但是从网上找的代码序列化之后存到txt文件中是乱码,因为我采用的是二进制的方式,不要和我说其他两个方法,因为对我们不适合,
把对象序列化的代码:
MemoryStream ms = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms ,list);
ms.Position = 0;
byte[] bytes = new byte[ms.Length];
ms.Read(bytes ,0,bytes .Length );
ms.Close();
ms.Flush();
Result.Append(System.Text.Encoding.Default.GetString(bytes));
return Result.ToString();然后把返回的字符串写到txt 中
/// <summary>
/// 向某文件中 追加内容,不覆盖
/// </summary>
/// <param name="FilePath">文件路径,相对根目录的路径</param>
/// <param name="Content">内容</param>
public static void InsertContent(string FileName, string Content)
{
CreateFile(FileName);
string filepath=path +FileName ;
if (File.Exists(filepath))
{
lock (new FileInfo ( filepath) )
{
StreamWriter sw = new StreamWriter(filepath, true);
sw.WriteLine(Content);
sw.Close();
sw.Dispose();
}
} }
然后读取的时候读取txt文件 在反序列化
if (!string.IsNullOrEmpty(jsonstring))
{
MemoryStream ms = new MemoryStream(System.Text.Encoding.Default.GetBytes(jsonstring));
ms.Position = 0;
BinaryFormatter formatter = new BinaryFormatter();
List<wf_Task_Inbox> entitys = (List<wf_Task_Inbox>)formatter.Deserialize(ms);
return entitys;
}
else { return null; }程序执行之后,txt中的文件
EDomains.Shared, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null ?System.Collections.Generic.List`1[[Domains.Shared.wf_Task_Inbox, Domains.Shared, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] _items_size_version Domains.Shared.wf_Task_Inbox[] Domains.Shared.wf_Task_Inbox
USystem.Data.Entity, Version=4.0.0.0, Culture=neutral, 内容是这样的读取的时候发生错误
把对象序列化的代码:
MemoryStream ms = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms ,list);
ms.Position = 0;
byte[] bytes = new byte[ms.Length];
ms.Read(bytes ,0,bytes .Length );
ms.Close();
ms.Flush();
Result.Append(System.Text.Encoding.Default.GetString(bytes));
return Result.ToString();然后把返回的字符串写到txt 中
/// <summary>
/// 向某文件中 追加内容,不覆盖
/// </summary>
/// <param name="FilePath">文件路径,相对根目录的路径</param>
/// <param name="Content">内容</param>
public static void InsertContent(string FileName, string Content)
{
CreateFile(FileName);
string filepath=path +FileName ;
if (File.Exists(filepath))
{
lock (new FileInfo ( filepath) )
{
StreamWriter sw = new StreamWriter(filepath, true);
sw.WriteLine(Content);
sw.Close();
sw.Dispose();
}
} }
然后读取的时候读取txt文件 在反序列化
if (!string.IsNullOrEmpty(jsonstring))
{
MemoryStream ms = new MemoryStream(System.Text.Encoding.Default.GetBytes(jsonstring));
ms.Position = 0;
BinaryFormatter formatter = new BinaryFormatter();
List<wf_Task_Inbox> entitys = (List<wf_Task_Inbox>)formatter.Deserialize(ms);
return entitys;
}
else { return null; }程序执行之后,txt中的文件
EDomains.Shared, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null ?System.Collections.Generic.List`1[[Domains.Shared.wf_Task_Inbox, Domains.Shared, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] _items_size_version Domains.Shared.wf_Task_Inbox[] Domains.Shared.wf_Task_Inbox
USystem.Data.Entity, Version=4.0.0.0, Culture=neutral, 内容是这样的读取的时候发生错误
我觉得楼主你有概念性错误,你所谓的txt文件不知道是不是指文本文件,如果是的话我想问一句,XML文件难道不是文本文件吗,无非文件的扩展名不一样罢了,它们都是可以用记事本打开查看的呀。我想你们老大所要求的txt应该是指可以被人直接阅读的文本文件吧,否则是XML还是其它格式又有什么关系呢。如果要这样做,我劝你还是不要走序列化这条路了,自己定义一种txt文件的格式,并通过StreamReader和StreamWriter这两个类来操作,即能被人读懂,也能由程序来读写。
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms ,list);
System.IO.File.WriteAllBytes("xxx.dat", ms.ToArray());如果你非要写string的话,也应该是将byte[]转成"0xFF"这样的,然后写到txt里。
另外如果要AppendText的话,也要定义一个分隔符号,让不同对象的数据分割开来。
StreamWriter sw = new StreamWriter(filepath, true);
sw.WriteLine(Content);
此类不能写入二进制数据的
使用:BinaryReader 用特定的编码将基元数据类型读作二进制值。
BinaryWriter 以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。
2、用base64处理你的二进制数据,然后写入Txt中,这样肯定没错,不过Txt的大小会增大33%
沿用以前的代码,写入之前调用Convert.ToBase64String(),写入base64串,而不是二进制
读取后再调用Convert.FromBase64String()转换base64到byte[],然后反序列化即可。
你是说 这样处理不?
sw.WriteLine(Convert .ToBase64String( Content));