首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用内存流进行序列化/反序列化

使用内存流进行序列化/反序列化
EN

Stack Overflow用户
提问于 2012-05-01 04:47:53
回答 4查看 155.7K关注 0票数 48

我在使用内存流进行序列化时遇到了一个问题。下面是我的代码:

代码语言:javascript
复制
/// <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;
} 

我得到的错误如下:流不是有效的二进制格式。起始内容(以字节为单位)是: blah...

我不太确定是什么导致了这个错误。任何帮助都将不胜感激。

调用示例:

代码语言:javascript
复制
Dog myDog = new Dog();
myDog.Name= "Foo";
myDog.Color = DogColor.Brown;

MemoryStream stream = SerializeToStream(myDog)

Dog newDog = (Dog)DeserializeFromStream(stream);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-01 05:14:41

下面的代码适用于我:

代码语言:javascript
复制
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());
}

其中类型如下所示:

代码语言:javascript
复制
[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);
    }
}

实用的方法是:

代码语言:javascript
复制
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;
}
票数 58
EN

Stack Overflow用户

发布于 2018-08-30 03:31:49

使用方法从内存中序列化和反序列化Collection对象。这适用于集合数据类型。此方法将把任何类型的集合序列化为字节流。创建一个单独的类SerilizeDeserialize,并添加以下两个方法:

代码语言:javascript
复制
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;
    }

}

如何在你的类中使用这些方法:

代码语言:javascript
复制
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);
}
票数 6
EN

Stack Overflow用户

发布于 2012-05-01 05:49:22

在某些特定情况下,BinaryFormatter可能会产生无效输出。例如,它将省略不成对的代理项字符。它也可能在接口类型的值方面有问题。阅读此documentation page,包括社区内容。

如果您发现您的错误是持续性的,那么您可能需要考虑使用DataContractSerializerXmlSerializer之类的XML序列化程序。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10390356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档