如果一个类型是可序列化的或具有为其定义的 TypeConverter,则该类型可以存留在 ViewState 中.
我知道我定义的类不是序列化的
只有实现ISerializable才能放在viewstate中。
但是具体怎么做呢?

解决方案 »

  1.   

    dingggggggggggggggggggggggggggggggggggggggggggggggggg
      

  2.   

    试试在您的类加上序列化属性,如: [Serializable]
    public class ChatInfo
      

  3.   

    gOODiDEA(无语) ( ) 的做法是对的
    自定义类要从ViewState里取出
    在自定义类前加
    [Serializable]
    MSDN的例子:using System;
    using System.IO;
    using System.Collections;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Runtime.Serialization;
    // There should be only one instance of this type per AppDomain.
    [Serializable]
    public sealed class Singleton : ISerializable 
    {
        // This is the one instance of this type.
        private static readonly Singleton theOneObject = new Singleton();    // Here are the instance fields.
        public String someString;
        public Int32 someNumber;    // Private constructor allowing this type to construct the Singleton.
        private Singleton() 
        { 
            // Do whatever is necessary to initialize the Singleton.
            someString = "This is a string field";
            someNumber = 123;
        }    // A method returning a reference to the Singleton.
        public static Singleton GetSingleton() 
        { 
            return theOneObject; 
        }    // A method called when serializing a Singleton.
        void ISerializable.GetObjectData(
            SerializationInfo info, StreamingContext context) 
        {
            // Instead of serializing this object, 
            // serialize a SingletonSerializationHelp instead.
            info.SetType(typeof(SingletonSerializationHelper));
            // No other values need to be added.
        }    // Note: ISerializable's special constructor is not necessary 
        // because it is never called.
    }
    [Serializable]
    internal sealed class SingletonSerializationHelper : IObjectReference 
    {
        // This object has no fields (although it could).    // GetRealObject is called after this object is deserialized.
        public Object GetRealObject(StreamingContext context) 
        {
            // When deserialiing this object, return a reference to 
            // the Singleton object instead.
            return Singleton.GetSingleton();
        }
    }
    class App 
    {
        [STAThread]
        static void Main() 
        {
            FileStream fs = new FileStream("DataFile.dat", FileMode.Create);        try 
            {
                // Construct a BinaryFormatter and use it 
                // to serialize the data to the stream.
                BinaryFormatter formatter = new BinaryFormatter();            // Create an array with multiple elements refering to 
                // the one Singleton object.
                Singleton[] a1 = { Singleton.GetSingleton(), Singleton.GetSingleton() };            // This displays "True".
                Console.WriteLine(
                    "Do both array elements refer to the same object? " + 
                    (a1[0] == a1[1]));                 // Serialize the array elements.
                formatter.Serialize(fs, a1);            // Deserialize the array elements.
                fs.Position = 0;
                Singleton[] a2 = (Singleton[]) formatter.Deserialize(fs);            // This displays "True".
                Console.WriteLine("Do both array elements refer to the same object? " 
                    + (a2[0] == a2[1]));             // This displays "True".
                Console.WriteLine("Do all array elements refer to the same object? " 
                    + (a1[0] == a2[0]));
            }   
            catch (SerializationException e) 
            {
                Console.WriteLine("Failed to serialize. Reason: " + e.Message);
                throw;
            }
            finally 
            {
                fs.Close();
            }
        }
    }