在一次项目开发中遇到需要WebService中需要返回Hashtable的情况。当经过一次又一次的尝试以后发现,WebService是不能使用Hashtable的,然后我们才去的办法是把数据转换成一个String或者String数组然后进行传递。但是这样的转换很消耗资源。于是我们想到了序列化。

  方式一(必须把类设置为可序列化,序列化后较大但是较方便)

  

/// <summary>
        /// 把对象序列化并返回相应的字节
        /// </summary>
        /// <param name="pObj">需要序列化的对象</param>
        /// <returns>byte[]</returns>
        public byte[] SerializeObject(object pObj)
        {
            if (pObj == null)
                return null;
            System.IO.MemoryStream _memory = new System.IO.MemoryStream();
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(_memory, pObj);
            _memory.Position = 0;
            byte[] read = new byte[_memory.Length];
            _memory.Read(read, 0, read.Length);
            _memory.Close();
            return read;
        }


        /// <summary>
        /// 把字节反序列化成相应的对象
        /// </summary>
        /// <param name="pBytes">字节流</param>
        /// <returns>object</returns>
        public object DeserializeObject(byte[] pBytes)
        {
            object _newOjb = null;
            if (pBytes == null)
                return _newOjb;
            System.IO.MemoryStream _memory = new System.IO.MemoryStream(pBytes);
            _memory.Position = 0;
            BinaryFormatter formatter = new BinaryFormatter();
            _newOjb = formatter.Deserialize(_memory);
            _memory.Close();
            return _newOjb;
        }

 方式二(可不用设置类为可序列化,序列化后大小较小但较为麻烦)

类TestClasscs

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace XLH
{
    public class TestClasscs
    {
        private string name = "";
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        private int _age = 1;

        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        private bool _sex = false;
        public bool Sex
        {
            get { return _sex; }
            set { _sex = value; }
        }

        private Test1 _test = new Test1();
        public Test1 Test
        {
            get { return _test; }
            set { _test = value; }
        }
        /// <summary>
        /// 序列化
        /// </summary>
        /// <returns></returns>
        public byte[] GetBytes()
        {
            MemoryStream output = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(output);
            writer.Write(this.Name);
            writer.Write(this.Age);
            writer.Write(this.Sex);
            byte[] buff = this.Test.ToBytes();
            writer.Write(buff.Length);
            writer.Write(buff);
            writer.Close();
            output.Close();
            return output.ToArray();
        }
        /// <summary>
        /// 反序列化
        /// </summary>
        /// <param name="infos"></param>
        /// <returns></returns>
        public TestClasscs ToObject(byte[] infos)
        {
            if ((infos == null) || (infos.Length <= 4))
            {
                return null;
            }
            TestClasscs info = new TestClasscs();
            MemoryStream input = new MemoryStream(infos);
            BinaryReader reader = new BinaryReader(input);
            info.Name = reader.ReadString();
            info.Age = reader.ReadInt32();
            info.Sex = reader.ReadBoolean();
            int count = reader.ReadInt32();
            info.Test = info.Test.ToObject(reader.ReadBytes(count));
            reader.Close();
            input.Close();
            return info;
        }
    }
}

类Test1

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace XLH
{
    public class Test1
    {
        private string s = "abcd";

        public string S
        {
            get { return s; }
            set { s = value; }
        }

        public byte[] ToBytes()
        {
            MemoryStream output = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(output);
            writer.Write(this.s);
            writer.Close();
            output.Close();
            return output.ToArray();
        }

        public Test1 ToObject(byte[] data)
        {
            if ((data == null) || (data.Length <= 4))
            {
                return null;
            }
            Test1 info = new Test1();
            MemoryStream input = new MemoryStream(data);
            BinaryReader reader = new BinaryReader(input);
            info.S = reader.ReadString();
            reader.Close();
            input.Close();
            return info;
        }

    }
}