zoukankan      html  css  js  c++  java
  • 序列化的使用技巧

           VS2003中用BinaryFormater来序列化一个对象时会有这样的情况存在。从一时期版本的已序列化对象进行对象创建时会因字段的增加而出现异常。通过查阅MSDN可以得知通过自定义序列化处理。
           在将对象序列化之前,最好先做下面的事情,将聚合的对象尽量置空(null)否则序列化后的结果可能会很大!将事件置空!否则序列化过程中要求事件订阅者的元数据(即元数据也要序列化)
            在VS2003中序列化CollectionBase继承的类时会产生问题,解决的办法是实现其索引器方法。
             对多维数组直接进行XML序列化时也会出现问题,解决的办法是将其转换为数组的数组。
           下面是自定义序列化的实现方法:(2005 VS.net 已经提供了类似的功能,不需要现这样做了:))

        public class Serialize
        
    {
            
    public static void DoSerialize(SerializationInfo info, StreamingContext context,object obj)
            
    {
                
    foreach(FieldInfo fi in obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
                
    {
                    
    try            // 一定要放于foreach的里边,否则会丢失成员信息
                    {
                        
    string s = fi.Name;
                        
    object o = fi.GetValue(obj);
                        info.AddValue(s,o);
                    }

                    
    catch(Exception e)
                    
    {
                        MessageBox.Show(e.ToString());            
                    }

                }

            }

            
    public static void DeSerialize(SerializationInfo info, StreamingContext context, object obj)
            
    {
                
    foreach(FieldInfo fi in obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
                
    {
                    
    try            // 一定要放于foreach的里边,否则会丢失成员信息
                    {
                        
    string s = fi.Name;
                        
    object o = info.GetValue(s,fi.FieldType);
                        fi.SetValue(obj,o);
                    }

                    
    catch(Exception){}
                }

            }

            
    public static byte[] ToBytes(object obj)
            
    {
                
    try
                
    {
                    
    // 进行序列化操作
                    MemoryStream ms = new MemoryStream();
                    BinaryFormatter serializer 
    = new BinaryFormatter();
                    serializer.Serialize(ms,obj);
                    
    return ms.ToArray();
                }

                
    catch(Exception e)
                
    {
                    MessageBox.Show(e.ToString());
                    
    return null;
                }

            }


            
    public static object ToObject(byte[] ary)
            
    {
                
    try
                
    {
                    
    // 进行反序列化操作
                    MemoryStream ms = new MemoryStream(ary);
                    ms.Position 
    = 0;
                    BinaryFormatter serializer 
    = new BinaryFormatter();
                    
    return serializer.Deserialize(ms);
                }

                
    catch(Exception e)
                
    {
                    MessageBox.Show(e.ToString());
                    
    return null;
                }

            }

        }

             使用的例子如下:
        [Serializable()]
        
    public class ProjectOptions : ISerializable
        {
            
    // 成员声明 
    \        …
            
    // 下面这一行是必须的,即使没有内容也要有一个构造函数
            public ProjectOptions() {}

            
    #region ISerializable 成员
            
    public ProjectOptions(SerializationInfo info, StreamingContext context)
            {
                Serialize.DeSerialize(info,context,
    this);
            }
            
    public void GetObjectData(SerializationInfo info, StreamingContext context)
            {
                Serialize.DoSerialize(info,context,
    this);
            }
            
    #endregion
        }
  • 相关阅读:
    MySQL — 优化之explain执行计划详解(转)
    项目中常用的MySQL 优化
    通过 MySQL 存储原理来分析排序和锁(转)
    java内存模型(转)
    数据库索引的创建原则
    MySQL中的几种日志了解
    一条SQL语句在MySQL中如何执行的
    SQL
    SQL
    SqlServer性能优化 查询和索引优化(十二)
  • 原文地址:https://www.cnblogs.com/llxxbb/p/Using_Serialize.html
Copyright © 2011-2022 走看看