请教各位大虾,二进制跨进程序列化的问题

最近在做一个项目,项目有很多的对象状态需要保存,以供其他的服务调用;我就想在做一个对象序列化的通用程序,因为二进制和XML各有优缺,就想做好后在使用的过程中跟据需求调用,真是没想到一开始就碰了个大石头,XML完没有问题,但二进制反序列碰到了很头疼的问题,在同进程里序列化反序列化都很正常,但如果退出程序在重新进去,在反序列化后得的对象里面的值都是空的,就是说跨进程后,反序化出来的对像就是一个空的;乱了几天还是没找到原因,这里我把测试的代码贴出来,代码非常简单,请各位大虾帮忙看看问题在那,小弟在这里谢过了!!!

这个是被序列化和反序列化的类很简单就三个属性

View Code
using System;
namespace Serialization
{
   [Serializable]   
    public class book
    {
        private static string book_name;
        private static string book_isbn;
        [NonSerialized]
        public string book_price;

        public string bookName
        {
            set { book_name = value; }
            get { return book_name; }
        }
        public string bookIsbn
        {
            set { book_isbn = value; }
            get { return book_isbn; }
        }  
    }
}

 

这个是调用程序

View Code
  /// <summary>
        /// 二进制序列化调用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void butSeriaBinary_Click(object sender, EventArgs e)
        {
            book bo = new book();
            bo.bookIsbn = this.textBox1.Text;
            bo.bookName = this.textBox2.Text;
            bo.book_price = this.textBox3.Text;
            SerilizeAnobjectBinary(bo, @"C:\test.dat");
        }
        /// <summary>
        /// 二进制反序列化调用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void butSeriaBinaryNo_Click(object sender, EventArgs e)
        {
            book bo = (book)DeserilizeAnObjectBinary(@"C:\test.dat");
                this.textBox1.Text = bo.bookIsbn;
                this.textBox2.Text = bo.bookName;
                this.textBox3.Text = bo.book_price;              
        }
        /// <summary>
        /// XML序列化调用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void butSeriaXml_Click(object sender, EventArgs e)
        {
            book bo = new book();
            bo.bookIsbn = this.textBox1.Text;
            bo.bookName = this.textBox2.Text;
            bo.book_price = this.textBox3.Text;

            SerilizeAnObject(bo, @"C:\test.xml");
        }
        /// <summary>
        /// XML反序列化调用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void butSeriaXmlNo_Click(object sender, EventArgs e)
        {
          book bo=(book)DeserilizeAnObject(typeof(book),@"c:\test.xml");
          this.textBox1.Text = bo.bookIsbn;
          this.textBox2.Text = bo.bookName;
          this.textBox3.Text = bo.book_price;
        }    

这个是XML的序列化和反序列化没的问题,这里也贴出来参考下

View Code
 /// <summary>
        /// XmlSerializer序列化
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="path"></param>
        private static void SerilizeAnObject(object obj, string path)
        {
            System.IO.FileStream stream = new FileStream(path, FileMode.Create); 
            try
            {
              XmlSerializer serializer = new XmlSerializer(obj.GetType());
                serializer.Serialize(stream, obj);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                stream.Close();
                stream.Dispose();
            }
        }       
        /// <summary>
        /// XmlSerializer反序列化
        /// </summary>
        /// <param name="type"></param>
        /// <param name="path"></param>
        /// <returns></returns>
        private static object DeserilizeAnObject(Type type, string path)
        {
            object obj = null;
            FileStream stream = new FileStream(path, FileMode.Open);
            try
            {
                XmlReader reader = new XmlTextReader(stream);
                XmlSerializer serializer =new XmlSerializer(type);
                obj = serializer.Deserialize(reader);
            }
            catch (Exception ex)
            {
               MessageBox.Show( ex.Message);
            }
            finally
            {
                stream.Close();
                stream.Dispose();
            }
            return obj;
        }       

问题代码来了,请各位高人一定帮帮忙

   
        /// <summary>
        /// BinaryFormatter二进制序列化
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="path"></param>
         private static void SerilizeAnobjectBinary(object obj, string path)
        {
            FileStream stream = new FileStream(path, FileMode.Create);
            try
            {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(stream, obj);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                stream.Close();
                stream.Dispose();
            }
        }
        /// <summary>
         /// BinaryFormatter二进制反序列化
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
         private static object DeserilizeAnObjectBinary(string path)
         {
             object obj = null;
             FileStream stream = new FileStream(path, FileMode.Open);
             try
             {
                 BinaryFormatter bf = new BinaryFormatter();
                 obj = bf.Deserialize(stream);
                 return obj;
             }
             catch (Exception e)
             {
                 MessageBox.Show(e.Message);
                 return null;
             }
             finally
             {
                 stream.Close();
                 stream.Dispose();
             }
         }

 

 

转载于:https://www.cnblogs.com/ices/archive/2012/06/06/2538595.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值