美文网首页
C#序列化

C#序列化

作者: 晓龙酱 | 来源:发表于2017-09-18 10:31 被阅读82次

序列化操作

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public class BinarySerializer
{
#region Serialize
    public static void SerializeToFile<T>(T obj, string fileDir, string fullName)
    {
        if(!(Directory.Exists(fileDir)))
        {
            Directory.CreateDirectory(fileDir);
        }

        string fullPath = string.Format(@"{0}\{1}", fileDir, fullName);
        using(FileStream fs = new FileStream(fullPath, FileMode.OpenOrCreate))
        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(fs, obj);
            fs.Flush();
        }
    }

    public static string SerializeToString<T>(T obj)
    {
        using(MemoryStream ms = new MemoryStream())
        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, obj);
            return System.Text.Encoding.UTF8.GetString(ms.ToArray());
        }
    }
#endregion

#region Deserialize
    public static T DeserializeFromFile<T>(string path) where T : class
    {
        using(FileStream fs = new FileStream(path, FileMode.Open))
        {
            
            BinaryFormatter bf = new BinaryFormatter();
            return bf.Deserialize(fs) as T;
        }
    }

   public static T DeserializeFromString<T>(string content) where T : class
   {
       byte[] arrBytes = System.Text.Encoding.UTF8.GetBytes(content);
       using(MemoryStream ms = new MemoryStream())
       {
           BinaryFormatter bf = new BinaryFormatter();
           return bf.Deserialize(ms) as T;        
       }
   }

#endregion
}

序列化对象声明

<font size=2>对类使用序列化时,标注那些不需要序列化的字段。 序列化只能针对字段使用。</font>

[Serializable]
public class MyClass
{
    [Noserialized]
    public string Temp;
    
    [field:Noserialized]    用于标识event不被序列
    public event EventHandler TempChanged;
}

使用序列化相关特性

<font size=2>同时还可以利用特性,在序列化,反序列化执行过程中,自动调用指定的方法,进一步处理序列化数据。例如,可以在执行完反序列化后,自动初始化一些字段。
提供的特性有:

  • OnDeserializedAttribute
  • OnDeserializingAttribute
  • OnSerializedAttribute
  • OnSerializingAttribute
    </font>
using System;
using System.Runtime.Serialization;


[Serializable]
public class SerializableObject
{
    [OnSerializingAttribute]
    virtual protected void OnSerializing(StreamingContext context)
    {

    }

    [OnSerializedAttribute]
    virtual protected void OnSerialized(StreamingContext context)
    {

    }

    [OnDeserializingAttribute]
    virtual protected void OnDeserializing(StreamingContext context)
    {

    }

    [OnDeserializedAttribute]
    virtual protected void OnDeserialized(StreamingContext context)
    {

    }
}

深度定制化ISerializable

如果序列化特性不能满足需求,那就需要使用此接口来自定义化序列化操作。甚至可以序列化为另一个对象。
继承了此接口后,序列化特性就不会生效了。

Person p1 = new Person(){FirstName = "Nick", LastName = "Wang"};
BinarySerializer.SerializeToFile(p1, Application.dataPath, "person.txt");

Person p2 = BinarySerializer.DeserializeFromFile<Person>(System.IO.Path.Combine(Application.dataPath, "person.txt"));
Debug.Log(p2.FirstName);
[Serializable]
public class Person : ISerializable
{
    public string FirstName;
    public string LastName;
    public string ChineseName;

    public Person()
    {

    }

    protected Person(SerializationInfo info, StreamingContext context)
    {
        FirstName = info.GetString("FirstName");
        LastName = info.GetString("LastName");
        ChineseName = string.Format("{0} {1}", LastName, FirstName);        
    }

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("FirstName", FirstName);
        info.AddValue("LastName", LastName);
    }   
}

序列化为另一个对象

Person p1 = new Person(){FirstName = "Nick", LastName = "Wang"};
        BinarySerializer.SerializeToFile(p1, Application.dataPath, "person.txt");
        
        PersonAnother p2 = BinarySerializer.DeserializeFromFile<PersonAnother>(System.IO.Path.Combine(Application.dataPath, "person.txt"));
        Debug.Log(p2.Name);
        
[Serializable]
public class PersonAnother : ISerializable
{
    public string Name;

    public PersonAnother()
    {
    }

    protected PersonAnother(SerializationInfo info, StreamingContext context)
    {
        Name = info.GetString("Name");
    }

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
    }
}

[Serializable]
public class Person : ISerializable
{
    public string FirstName;
    public string LastName;
    public string ChineseName;

    public Person()
    {
    }

    protected Person(SerializationInfo info, StreamingContext context)
    {               
    }

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        <font color=blue>info.SetType(typeof(PersonAnother));}</font>
        info.AddValue("Name", string.Format("{0} {1}", LastName, FirstName));
    }   
}

相关文章

网友评论

      本文标题:C#序列化

      本文链接:https://www.haomeiwen.com/subject/glbvsxtx.html