最近学习序列化和反序列化操作,序列化大部分网上是把类序列化了用IO存到一个文件上(比如什么的DAT,BIN后缀的),或者是序列化成XML。我在网上找到一个序列化成字节的方法可以存到数据库,但是反序列化的时候报错 Exception of type 'System.OutOfMemoryException' was thrown.
代码如下,各位大神帮帮忙 public void SeralizeNow()
        {
            List<ClassToSeralize> listse = new List<ClassToSeralize>();
            ClassToSeralize cl1 = new ClassToSeralize();
            cl1.id = "1";
            cl1.name = "XXX";
            ClassToSeralize cl2 = new ClassToSeralize();
            cl2.id = "2";
            cl2.name = "XXXN";
            listse.Add(cl1);
            listse.Add(cl2);
            SerializeMethod(listse);
        }
        public void SerializeMethod(List<ClassToSeralize> listPers)
        {
            //序列化
            System.Runtime.Serialization.IFormatter form = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            Stream st=new MemoryStream();
            form.Serialize(st,listPers);
            st.Flush();
            st.Position=0;
            byte[] bytes=new byte[st.Length];
            st.Read(bytes,0,Convert.ToInt32(st.Length));
            string s = Encoding.ASCII.GetString(bytes);
            st.Close();
            
        }
        public void DeSerializeNow(string s)
        {
            System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            byte[] bytes = null;
            bytes =Encoding.ASCII.GetBytes(s);
            System.IO.Stream stream = new System.IO.MemoryStream(bytes);
            List<ClassToSeralize> obj = (List<ClassToSeralize>)formatter.Deserialize(stream);
            foreach (ClassToSeralize item in obj)
            {
                Response.Write(item.id);
                Response.Write(item.name);
            }
            stream.Close();
        }初学序列化,不知道如何学习啊....c#序列化泛型

解决方案 »

  1.   

    内存溢出,注意释放资源,使用完了 stream 要dispose
      

  2.   

    用BinaryFormatter 
    BinaryFormatter b = new BinaryFormatter();
    c = b.Deserialize(fileStream) as ClassToSerialize;
      

  3.   

    这里不对string s = Encoding.ASCII.GetString(bytes); 
    Encoding.ASCII.GetBytes(s);将数据转换为字符串:
    string s = string.Join(",", bytes.Select(x => x.ToString("x").PadLeft(2, '0')));
    还原
    byte[] bytes = s.Split(',').Select(x => (byte)Convert.ToInt32(x, 16)).ToArray();