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
        }
  • 相关阅读:
    sklearn.model_selection.validation_curve 验证曲线
    sklearn.model_selection.learning_curve学习曲线
    sklearn.pipeline.Pipeline管道简化工作流
    什么时候需要做数据标准化
    小程序获取用户默认地址的代码
    微信小程序--更换用户头像/上传用户头像/更新用户头像
    小程序 image跟view标签上下会有间隙
    小程序宽100%,高自适应怎么做?
    小程序图片点击放大右滑
    小程序can't read property 'push' of undefined
  • 原文地址:https://www.cnblogs.com/llxxbb/p/Using_Serialize.html
Copyright © 2011-2022 走看看