using System;
using System.IO;
using System.Collections;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;public class App 
{
    [STAThread]
    static void Main() 
    {
        Serialize();
        Deserialize();
    }    static void Serialize() 
    {
        // Create a hashtable of values that will eventually be serialized.
        Hashtable addresses = new Hashtable();
        addresses.Add("Jeff", "123 Main Street, Redmond, WA 98052");
        addresses.Add("Fred", "987 Pine Road, Phila., PA 19116");
        addresses.Add("Mary", "PO Box 112233, Palo Alto, CA 94301");        // To serialize the hashtable and its key/value pairs,  
        // you must first open a stream for writing. 
        // In this case, use a file stream.
        FileStream fs = new FileStream("DataFile.dat", FileMode.Create);        // Construct a BinaryFormatter and use it to serialize the data to the stream.
        BinaryFormatter formatter = new BinaryFormatter();
        try 
        {
            formatter.Serialize(fs, addresses);
        }
        catch (SerializationException e) 
        {
            Console.WriteLine("Failed to serialize. Reason: " + e.Message);
            throw;
        }
        finally 
        {
            fs.Close();
        }
    }   
    static void Deserialize() 
    {
        // Declare the hashtable reference.
        Hashtable addresses  = null;        // Open the file containing the data that you want to deserialize.
        FileStream fs = new FileStream("DataFile.dat", FileMode.Open);
        try 
        {
            BinaryFormatter formatter = new BinaryFormatter();            // Deserialize the hashtable from the file and 
            // assign the reference to the local variable.
            addresses = (Hashtable) formatter.Deserialize(fs);
        }
        catch (SerializationException e) 
        {
            Console.WriteLine("Failed to deserialize. Reason: " + e.Message);
            throw;
        }
        finally 
        {
            fs.Close();
        }        // To prove that the table deserialized correctly, 
        // display the key/value pairs.
        foreach (DictionaryEntry de in addresses) 
        {
            Console.WriteLine("{0} lives at {1}.", de.Key, de.Value);
        }
    }
}[C++] 
#using <mscorlib.dll>using namespace System;
using namespace System::IO;
using namespace System::Collections;
using namespace System::Runtime::Serialization::Formatters::Binary;
using namespace System::Runtime::Serialization;__gc class App 
{
public:
    static void Serialize() 
    {
        // Create a hashtable of values that will eventually be serialized.
        Hashtable* addresses = new Hashtable();
        addresses->Add(S"Jeff", S"123 Main Street, Redmond, WA 98052");
        addresses->Add(S"Fred", S"987 Pine Road, Phila., PA 19116");
        addresses->Add(S"Mary", S"PO Box 112233, Palo Alto, CA 94301");        // To serialize the hashtable (and its keys/values),  
        // you must first open a stream for writing. 
        // In this case we will use a file stream.
        FileStream* fs = new FileStream(S"DataFile.dat", FileMode::Create);        // Construct a BinaryFormatter and use it to serialize the data to the stream.
        BinaryFormatter* formatter = new BinaryFormatter();
        try 
        {
            formatter->Serialize(fs, addresses);
        }
        catch (SerializationException* e) 
        {
            Console::WriteLine(S"Failed to serialize. Reason: {0}", e->Message);
            throw;
        }
        __finally 
        {
            fs->Close();
        }
    }    static void Deserialize() 
    {
        // Declare the hashtable reference.
        Hashtable* addresses = 0;        // Open the file containing the data that we want to deserialize.
        FileStream* fs = new FileStream(S"DataFile.dat", FileMode::Open);
        try 
        {
            BinaryFormatter* formatter = new BinaryFormatter();            // Deserialize the hashtable from the file and 
            // assign the reference to our local variable.
            addresses = dynamic_cast<Hashtable*>(formatter->Deserialize(fs));
        }
        catch (SerializationException* e) 
        {
            Console::WriteLine(S"Failed to deserialize. Reason: {0}", e->Message);
            throw;
        }
        __finally 
        {
            fs->Close();
        }        // To prove that the table deserialized correctly, display the keys/values.
        IEnumerator* myEnum = addresses->GetEnumerator();
        while (myEnum->MoveNext()) 
        {
            DictionaryEntry* de = __try_cast<DictionaryEntry*>(myEnum->Current);            Console::WriteLine(S" {0} lives at {1}.", de->Key, de->Value);
        }
    }
};[STAThread]
int main() 
{
    App::Serialize();
    App::Deserialize();
    return 0;
}[JScript] 没有可用于 JScript 的示例。若要查看 Visual Basic、C# 或 C++ 示例,请单击页左上角的“语言筛选器”按钮 。要求

解决方案 »

  1.   

    讨论楼上的方法:
    我将下面三个数据项都注释以后发现序列化会产生一个240byte的dat文件
    //addresses.Add("Jeff", "123 Main Street, Redmond, WA 98052");
    //addresses.Add("Fred", "987 Pine Road, Phila., PA 19116");
    //addresses.Add("Mary", "PO Box 112233, Palo Alto, CA 94301");
    当放开以后,会产生387byte的文件如果应用是在本机的话,不会有任何问题,这点冗余的数据量可以忽略不计
    但如果程序是在网络上走的话,可能这些冗余的数据就很不爽了
    而且.net的二进制序列化的格式只有.net认识,如果设计到其他平台的数据兼容性问题等就会遇到很大的麻烦关于该问题大家有什么看法可以发我email: [email protected]
      

  2.   

    你可以结合平台调用和序列化

    structlayout 属性定义所有字段的具体内存布局