c# - 使用 BinaryFormatter 序列化和反序列化对象图

标签 c# serialization binaryformatter

我正在尝试将我的对象图序列化为字符串,然后将其从字符串中反序列化。如果我这样做,对象序列化就好了

using (var memStream = new System.IO.MemoryStream())
{
     mf.Serialize(memStream, this);
     memStream.Seek(0, 0);

     Search s;
     using (var memStrClone = new System.IO.MemoryStream())
     {
          memStream.CopyTo(memStrClone);
          memStrClone.Seek(0, 0);
          s = mf.Deserialize(memStrClone) as Search;
     }
}

上面的代码有效,但序列化为一个字符串并尝试像这样反序列化相同的字符串

Search s;
string xml = ToString<Search>(this);
s = FromString<Search>(xml);

public static TType FromString<TType>(string input)
{
     var byteArray = Encoding.ASCII.GetBytes(input);
     using (var stream = new MemoryStream(byteArray))
     {
          var bf = new BinaryFormatter();
          return (TType)bf.Deserialize(stream);
     }
}

public static string ToString<TType>(TType data)
{
     using (var ms = new MemoryStream())
     {
          var bf = new BinaryFormatter();
          bf.Serialize(ms, data);
          return Encoding.ASCII.GetString(ms.GetBuffer());
     }
}

抛出异常

No assembly ID for object type '1936026741 Core.Sebring.BusinessObjects.Search.Search'.

非常感谢任何帮助。谢谢。

最佳答案

这里有一些代码可以做你想做的事(我认为)——但我不得不问——你为什么要序列化成这样的字符串?

如果类足够简单,可以序列化为字符串,则使用更容易处理的 XML 序列化程序;如果你想将它序列化到磁盘,二进制将它写到一个文件,如果它很复杂并且你正在序列化它以传输 - 考虑使用像 protobuf-net 这样的东西。

我认为你的问题的症结在于你正在尝试使用 ASCII 编码 - 我正在使用 Base64 编码。

无论如何 - 开始(我刚刚猜到了你的搜索类!)

 class Program
{
    [Serializable]
    public class Search
    {
        public Guid ID { get; private set; }

        public Search() { }

        public Search(Guid id)
        {
            ID = id;
        }

        public override string ToString()
        {
            return ID.ToString();
        }
    }

    static void Main(string[] args)
    {
        Search search = new Search(Guid.NewGuid());
        Console.WriteLine(search);
        string serialized = SerializeTest.SerializeToString(search);
        Search rehydrated = SerializeTest.DeSerializeFromString<Search>(serialized);
        Console.WriteLine(rehydrated);

        Console.ReadLine();
    }
}

public class SerializeTest
{
    public static Encoding _Encoding = Encoding.Unicode;

    public static string SerializeToString(object obj)
    {
        byte[] byteArray = BinarySerializeObject(obj);
        return Convert.ToBase64String(byteArray);
    }

    public static T DeSerializeFromString<T>(string input)
    {
        byte[] byteArray = Convert.FromBase64String(input);
        return BinaryDeserializeObject<T>(byteArray);
    }

    /// <summary>
    /// Takes a byte array and deserializes it back to its type of <see cref="T"/>
    /// </summary>
    /// <typeparam name="T">The Type to deserialize to</typeparam>
    /// <param name="serializedType">The object as a byte array</param>
    /// <returns>The deserialized type</returns>
    public static T BinaryDeserializeObject<T>(byte[] serializedType)
    {
        if (serializedType == null)
            throw new ArgumentNullException("serializedType");

        if (serializedType.Length.Equals(0))
            throw new ArgumentException("serializedType");

        T deserializedObject;

        using (MemoryStream memoryStream = new MemoryStream(serializedType))
        {
            BinaryFormatter deserializer = new BinaryFormatter();
            deserializedObject = (T)deserializer.Deserialize(memoryStream);
        }

        return deserializedObject;
    }

    /// <summary>
    /// Takes an object and serializes it into a byte array
    /// </summary>
    /// <param name="objectToSerialize">The object to serialize</param>
    /// <returns>The object as a <see cref="byte"/> array</returns>
    public static byte[] BinarySerializeObject(object objectToSerialize)
    {
        if (objectToSerialize == null)
            throw new ArgumentNullException("objectToSerialize");

        byte[] serializedObject;

        using (MemoryStream stream = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, objectToSerialize);
            serializedObject = stream.ToArray();
        }

        return serializedObject;
    }

}

HTH

关于c# - 使用 BinaryFormatter 序列化和反序列化对象图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14914302/

相关文章:

c# - Controller 中的 ASP.NET Core MVC 子操作

serialization - 为什么 ActionSupport 实现 Serializable

json - DateTimes 反序列化错误 : JsonConvert is returning wrong dates

.net - 如何重构在 .NET 中序列化的类?

调用 web api 时 C# 不支持授权类型

c# - Skybound GeckoFX 设置主机字段

c# - 如何以编程方式记录 PerformanceCounter

c - 将数据序列化为连续数组

c# - 互换使用 BinaryFormatter 和 XmlSerializer

java - 在Java中反序列化C#生成的RabbitMQ消息