与内存流C#序列化/反序列化 [英] C# serializing/deserializing with memory stream

查看:173
本文介绍了与内存流C#序列化/反序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在使用内存流序列化的问题。这里是我的code:

  ///<总结>
///序列化给定的对象到内存流
///< /总结>
///< PARAM NAME =的objectType>在对象序列化和LT; /参数>
///<返回>将序列化对象作为内存流< /回报>
公共静态的MemoryStream SerializeToStream(对象的objectType)
{
    MemoryStream的流=新的MemoryStream();
    IFormatter格式=新的BinaryFormatter();
    formatter.Serialize(流的objectType);
    返回流;
}///<总结>
///反序列化作为对象
///< /总结>
///< PARAM NAME =流>到反序列化流< /参数>
///<返回>在反序列化对象< /回报>
公共静态对象DeserializeFromStream(MemoryStream的流)
{
    IFormatter格式=新的BinaryFormatter();
    stream.Seek(0,SeekOrigin.Begin);
    对象的objectType = formatter.Deserialize(流);
    返回的objectType;
}

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

我不太确定是什么原因造成的错误。任何帮助将大大AP preciated。

调用示例:

 狗myDog =新的狗();
myDog.Name =富;
myDog.Color = DogColor.Brown;MemoryStream的流= SerializeToStream(myDog)狗newDog =(狗)DeserializeFromStream(流);


解决方案

这code为我工作:

 公共无效的run()
{
    狗myDog =新的狗();
    myDog.Name =富;
    myDog.Color = DogColor.Brown;    的System.Console.WriteLine({0},myDog.ToString());    MemoryStream的流= SerializeToStream(myDog);    狗newDog =(狗)DeserializeFromStream(流);    的System.Console.WriteLine({0},newDog.ToString());
}

当类型是这样的:

  [Serializable接口]
公共枚举DogColor
{
    棕色,
    黑色,
    斑驳
}[Serializable接口]
公共类犬
{
    公共字符串名称
    {
        得到;组;
    }    公共DogColor颜色
    {
        获取;设置;
    }    公共重写字符串的ToString()
    {
        返回的String.Format(狗:{0} / {1},名称,颜色);
    }
}

和实用的方法是:

 公共静态的MemoryStream SerializeToStream(对象o)
    {
        MemoryStream的流=新的MemoryStream();
        IFormatter格式=新的BinaryFormatter();
        formatter.Serialize(流,O);
        返回流;
    }    公共静态对象DeserializeFromStream(MemoryStream的流)
    {
        IFormatter格式=新的BinaryFormatter();
        stream.Seek(0,SeekOrigin.Begin);
        对象o = formatter.Deserialize(流);
        返回O;
    }

I'm having an issue with serializing using memory stream. Here is my code:

/// <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;
} 

The error I'm getting is as follow: stream is not a valid binary format. The starting contents (in bytes) are: blah....

I'm not exactly sure what is causing the error. Any help would be greatly appreciated.

Example of the call:

Dog myDog = new Dog();
myDog.Name= "Foo";
myDog.Color = DogColor.Brown;

MemoryStream stream = SerializeToStream(myDog)

Dog newDog = (Dog)DeserializeFromStream(stream);

解决方案

This code works for me:

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());
}

Where the types are like this:

[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);
    }
}

and the utility methods are:

    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;
    }

这篇关于与内存流C#序列化/反序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆