项目中因为每个人有任务,分为代办和承办任务,所以需要把每个人的任务存到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, 内容是这样的读取的时候发生错误

解决方案 »

  1.   

    BinaryFormatter 保存的应该是二进制文件。本来就不是给人读的。
      

  2.   

    既然用了BinaryFormatter就表明你准备将对象序列化为十进制数据,那二进制的数据存成文本文件能正常吗?更别提再读出来了。
    我觉得楼主你有概念性错误,你所谓的txt文件不知道是不是指文本文件,如果是的话我想问一句,XML文件难道不是文本文件吗,无非文件的扩展名不一样罢了,它们都是可以用记事本打开查看的呀。我想你们老大所要求的txt应该是指可以被人直接阅读的文本文件吧,否则是XML还是其它格式又有什么关系呢。如果要这样做,我劝你还是不要走序列化这条路了,自己定义一种txt文件的格式,并通过StreamReader和StreamWriter这两个类来操作,即能被人读懂,也能由程序来读写。
      

  3.   

    二进制读取保存到txt文本,读取的时候你更改设置为相应的编码方式。
      

  4.   

    你想要存放可读取的文本文件吗?那么你还得进行Base64编码,这样存为文本文件后就可读取了。(也可以直接每个二进制位ToString()写文本)
      

  5.   

    MemoryStream ms = new MemoryStream();
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(ms ,list);
    System.IO.File.WriteAllBytes("xxx.dat", ms.ToArray());如果你非要写string的话,也应该是将byte[]转成"0xFF"这样的,然后写到txt里。
    另外如果要AppendText的话,也要定义一个分隔符号,让不同对象的数据分割开来。
      

  6.   

    多谢各位提醒:我现在就是想实现  对象序列化存到txt文件中,然后读取出来能反序列化成对象就行
      

  7.   

    两种方法:1、因为是二进制数据,存储提取应采用二进制流方式,system.io中有2、用base64处理你的二进制数据,然后写入Txt中,这样肯定没错,不过Txt的大小会增大33%
      

  8.   

    我觉得,问题出现在这里:
    StreamWriter sw = new StreamWriter(filepath, true);
      sw.WriteLine(Content);
    此类不能写入二进制数据的
      

  9.   

    1、因为是二进制数据,存储提取应采用二进制流方式,system.io中有
       使用:BinaryReader 用特定的编码将基元数据类型读作二进制值。 
             BinaryWriter 以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。 
    2、用base64处理你的二进制数据,然后写入Txt中,这样肯定没错,不过Txt的大小会增大33%
       沿用以前的代码,写入之前调用Convert.ToBase64String(),写入base64串,而不是二进制
        读取后再调用Convert.FromBase64String()转换base64到byte[],然后反序列化即可。
      

  10.   


    你是说 这样处理不?
    sw.WriteLine(Convert .ToBase64String( Content));
      

  11.   

    问题怎么解决的,能交流下吗?能把关键代码给我发下吗?[email protected]