C# 使用内存流序列化/反序列化

C# 使用内存流序列化/反序列化,c#,serialization,deserialization,memorystream,C#,Serialization,Deserialization,Memorystream,我在使用内存流进行序列化时遇到问题。这是我的密码: /// <summary> /// serializes the given object into memory stream /// </summary> /// <param name="objectType">the object to be serialized</param> /// <returns>The serialized object as memory stre

我在使用内存流进行序列化时遇到问题。这是我的密码:

/// <summary>
/// serializes the given object into memory stream
/// </summary>
/// <param name="objectType">the object to be serialized</param>
/// <returns>The serialized object as memory stream</returns>
public static MemoryStream SerializeToStream(object objectType)
{
    MemoryStream stream = new MemoryStream();
    IFormatter formatter = new BinaryFormatter();
    formatter.Serialize(stream, objectType);
    return stream;
}

/// <summary>
/// deserializes as an object
/// </summary>
/// <param name="stream">the stream to deserialize</param>
/// <returns>the deserialized object</returns>
public static object DeserializeFromStream(MemoryStream stream)
{
    IFormatter formatter = new BinaryFormatter();
    stream.Seek(0, SeekOrigin.Begin);
    object objectType = formatter.Deserialize(stream);
    return objectType;
} 

此代码适用于我:

public void Run()
{
    Dog myDog = new Dog();
    myDog.Name= "Foo";
    myDog.Color = DogColor.Brown;

    System.Console.WriteLine("{0}", myDog.ToString());

    MemoryStream stream = SerializeToStream(myDog);

    Dog newDog = (Dog)DeserializeFromStream(stream);

    System.Console.WriteLine("{0}", newDog.ToString());
}
其中类型如下所示:

[Serializable]
public enum DogColor
{
    Brown,
    Black,
    Mottled
}

[Serializable]
public class Dog
{
    public String Name
    {
        get; set;
    }

    public DogColor Color
    {
        get;set;
    }

    public override String ToString()
    {
        return String.Format("Dog: {0}/{1}", Name, Color);
    }
}
实用方法有:

public static MemoryStream SerializeToStream(object o)
{
    MemoryStream stream = new MemoryStream();
    IFormatter formatter = new BinaryFormatter();
    formatter.Serialize(stream, o);
    return stream;
}

public static object DeserializeFromStream(MemoryStream stream)
{
    IFormatter formatter = new BinaryFormatter();
    stream.Seek(0, SeekOrigin.Begin);
    object o = formatter.Deserialize(stream);
    return o;
}

BinaryFormatter
在某些特定情况下可能会产生无效输出。例如,它将省略未配对的代理项字符。它还可能在接口类型的值方面存在问题。阅读这篇文章,包括社区内容


如果您发现您的错误是持久的,您可能需要考虑使用XML序列化程序,如“代码> DATACONTRATCTRORALIZER < /COD>或<代码> XMLSerialSuth。p> 使用方法从内存序列化和反序列化集合对象。这适用于集合数据类型。此方法将任何类型的集合序列化为字节流。创建一个单独的类,并添加以下两种方法:

public class SerilizeDeserialize
{

    // Serialize collection of any type to a byte stream

    public static byte[] Serialize<T>(T obj)
    {
        using (MemoryStream memStream = new MemoryStream())
        {
            BinaryFormatter binSerializer = new BinaryFormatter();
            binSerializer.Serialize(memStream, obj);
            return memStream.ToArray();
        }
    }

    // DSerialize collection of any type to a byte stream

    public static T Deserialize<T>(byte[] serializedObj)
    {
        T obj = default(T);
        using (MemoryStream memStream = new MemoryStream(serializedObj))
        {
            BinaryFormatter binSerializer = new BinaryFormatter();
            obj = (T)binSerializer.Deserialize(memStream);
        }
        return obj;
    }

}
公共类序列化反序列化
{
//将任何类型的集合序列化为字节流
公共静态字节[]序列化(T obj)
{
使用(MemoryStream memStream=new MemoryStream())
{
BinaryFormatter binSerializer=新的BinaryFormatter();
序列化(memStream,obj);
返回memStream.ToArray();
}
}
//将任何类型的集合序列化为字节流
公共静态T反序列化(字节[]序列化)
{
T obj=默认值(T);
使用(MemoryStream memStream=新的MemoryStream(j))
{
BinaryFormatter binSerializer=新的BinaryFormatter();
obj=(T)binSerializer.Deserialize(memStream);
}
返回obj;
}
}
如何在课堂上使用这些方法:

ArrayList arrayListMem = new ArrayList() { "One", "Two", "Three", "Four", "Five", "Six", "Seven" };
Console.WriteLine("Serializing to Memory : arrayListMem");
byte[] stream = SerilizeDeserialize.Serialize(arrayListMem);

ArrayList arrayListMemDes = new ArrayList();

arrayListMemDes = SerilizeDeserialize.Deserialize<ArrayList>(stream);

Console.WriteLine("DSerializing From Memory : arrayListMemDes");
foreach (var item in arrayListMemDes)
{
    Console.WriteLine(item);
}
ArrayList arraylistem=new ArrayList(){“一”、“二”、“三”、“四”、“五”、“六”、“七”};
WriteLine(“序列化到内存:arraylistem”);
byte[]stream=serializedeserialize.Serialize(arraylistem);
ArrayList arrayListMemDes=新的ArrayList();
arrayListMemDes=序列化反序列化。反序列化(流);
WriteLine(“从内存序列化:arraylistemdes”);
foreach(arrayListMemDes中的变量项)
{
控制台写入线(项目);
}

提供您用来调用方法的代码。您能告诉我们如何使用此代码吗?这个参数名为objectTypeI是可疑的。通过执行代码示例,我没有任何问题。您还有处理流对象的其他部分吗?这里也是,代码可以工作。你能带你的狗去上课吗?DogColor类型是什么?我实现了您现在建议的代码,代码抛出了这个异常:异常是由调用的目标抛出的。它出现在行对象o=formatter.Deserialize(流)中;我做错了什么?好吧,我在反序列化构造函数中犯了一个可怕的错误。我的一个属性的信息是错误的(即…=info.GetValue(“HerewasError_ItWasNonExistingThing”,typeof(int))),这里它是这个作业的一个很好的链接,可能有人需要它:同样感谢Cheeso,答案是好的。您可以使用此代码序列化对象用于在独立存储或远程存储中存储的字节流。借助于此,您可以在应用程序会话之间持久保存一个集合。谢谢您的帮助。为什么每个人都说你不能序列化匿名类型呢?
ArrayList arrayListMem = new ArrayList() { "One", "Two", "Three", "Four", "Five", "Six", "Seven" };
Console.WriteLine("Serializing to Memory : arrayListMem");
byte[] stream = SerilizeDeserialize.Serialize(arrayListMem);

ArrayList arrayListMemDes = new ArrayList();

arrayListMemDes = SerilizeDeserialize.Deserialize<ArrayList>(stream);

Console.WriteLine("DSerializing From Memory : arrayListMemDes");
foreach (var item in arrayListMemDes)
{
    Console.WriteLine(item);
}