Serializing/deserializing with memory stream

前端 未结 3 1533
难免孤独
难免孤独 2020-11-30 01:27

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

/// 
/// serializes the given object into memory stream
/// 

        
相关标签:
3条回答
  • 2020-11-30 01:43

    BinaryFormatter may produce invalid output in some specific cases. For example it will omit unpaired surrogate characters. It may also have problems with values of interface types. Read this documentation page including community content.

    If you find your error to be persistent you may want to consider using XML serializer like DataContractSerializer or XmlSerializer.

    0 讨论(0)
  • 2020-11-30 01:52

    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;
    }
    
    0 讨论(0)
  • 2020-11-30 01:55

    Use Method to Serialize and Deserialize Collection object from memory. This works on Collection Data Types. This Method will Serialize collection of any type to a byte stream. Create a Seperate Class SerilizeDeserialize and add following two methods:

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

    How To use these method in your Class:

    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);
    }
    
    0 讨论(0)
提交回复
热议问题