对象序列化

转载 2005年03月01日 16:53:00

using System;
using System.IO;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;
using System.Text;
using System.Collections;

public class SimpleGraph {


    public static void Main(String[] args) {

        Console.WriteLine ("创建对象图");
        TreeNode node = new TreeNode ("");
        FillTree (node);
        node.PrintTree (Console.Out);

        Console.Write ("正在将对象图序列化到磁盘..");
        Stream s = (Stream)File.Open("foo.xml", FileMode.Create, FileAccess.Write);
        SoapFormatter b = new SoapFormatter ();
        b.Serialize(s, node);
        s.Close();
        Console.WriteLine ("完成。");

        Console.Write ("正在从磁盘反序列化对象图..");
        Stream r = (Stream)File.Open("foo.xml", FileMode.Open, FileAccess.Read);
        SoapFormatter c = new SoapFormatter ();

        TreeNode n = (TreeNode) c.Deserialize(r);
        Console.WriteLine ("完成。");
        r.Close();
        n.PrintTree (Console.Out);

        Console.WriteLine ("/r/n按 Return 键退出。");
        Console.Read();
    }

    public static void FillTree (TreeNode node) {
        Type [] types = typeof (object).Module.Assembly.GetTypes();
        node.AddChild (new TreeNode (typeof(object).FullName));


        foreach (Type t in types) {
            if (t.BaseType == null) continue;
            if (!t.IsPublic) continue;
            TreeNode n = node.Find (t.BaseType.FullName);
            if (n != null) n.AddChild (new TreeNode (t));
        }
    }
}

[Serializable] public class TreeNode : ISerializable {
    private Object value;

    private ArrayList children;


    private TreeNode (SerializationInfo info, StreamingContext c) {
        value = info.GetValue ("value", typeof(object));
        children = new ArrayList ();
        Object o;

        for (int i = 1; i < info.MemberCount; i++) {
            o = info.GetValue (i.ToString(), typeof(object));
            children.Add (o);
        }
    }

    public TreeNode (Object val) {
        if (val == null) throw new Exception ("val 一定不能为空");
        value = val;
        children = new ArrayList ();
    }

    void ISerializable.GetObjectData (SerializationInfo info, StreamingContext context) {
        if (value == null) info.AddValue ("value", "NULL");
        else info.AddValue ("value", value.ToString() + "(SAVED)");
        int i = 1;
        foreach (object o in children) {
            if (o == null) continue;
            info.AddValue (i.ToString(), o);
            i++;
        }
    }

    public Object Value {
        get {
            return value;
        }
    }


    public void AddChild (TreeNode child) {
        if (!children.Contains (child))
            children.Add (child);
    }

    public TreeNode Find (Object val) {
        if (val == null) throw new Exception ("val 一定不能为空");
        if (value.Equals (val)) return this;
        foreach (TreeNode t in children) {
            TreeNode w = t.Find (val);
            if (w != null) return w;
        }
        return null;
    }

    override public bool Equals (Object obj) {
        if (! (obj is TreeNode)) return false;
        TreeNode t = (TreeNode) obj;
        return (t.value.Equals (this.value));
    }

    override public string ToString () {
        return value.ToString ();
    }

    public void PrintTree (TextWriter  output) {
        PrintTree (output, 0);
    }

    private void PrintTree (TextWriter  output, int offset) {
        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();
        for (int i =0; i < offset-1; i++) {
            sb1.Append (" ");
            sb1.Append ("|");
            sb2.Append (" ");
            sb2.Append ("|");
        }
        if (offset >=1) {
            sb1.Append (" ");
            sb1.Append ("+-");
            sb2.Append (" ");
            sb2.Append ("|");
        }
        output.WriteLine ("{0}", sb2);
        output.WriteLine ("{0}{1}", sb1, value);
        foreach (TreeNode t in children) {
            t.PrintTree (output, offset+1);
        }
    }
}

相关文章推荐

android webservice 对象序列化例子

  • 2015年06月19日 17:07
  • 145KB
  • 下载

jquery form序列化转换为json对象

做web前端开发时,需要ajax提交大量表单数据,如果一个个form字段拼接很费劲也容易出错,下面方法可解决这个问题 jquery form序列化转换为json对象 ...
  • nuli888
  • nuli888
  • 2016年07月10日 20:09
  • 1794

XStream对象序列化

  • 2008年06月22日 17:52
  • 427KB
  • 下载

通用序列化对象

  • 2008年07月10日 11:59
  • 881KB
  • 下载

Intent传递对象(两种序列化方式Serializable/Parcelable)

源 经验 活动 博客 招聘 精品视频 论坛›开发者交流›Android新手入门 ...

Android对象序列化的代码例子

  • 2016年05月05日 09:32
  • 1.99MB
  • 下载

androidMVC对象序列化

  • 2012年06月04日 11:21
  • 103KB
  • 下载

Android下利用SharePreference存储序列化对象的方法

在Android下做持久化的数据存储,大部分是用到了sqlite数据库或者sharepreference。当然我们为了图方便,少写sql语句,大部分都是用ORM形式的开源数据库框架,例如greenda...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对象序列化
举报原因:
原因补充:

(最多只允许输入30个字)