x-ite's diary

覚え書きです。想定読者は俺

Unity Serialization

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

public class BinarySerializer {

  public static byte[] Serialize(object serializableObject) {
    MemoryStream memoryStream = new MemoryStream();
		try {
   	  IFormatter formatterEncode = new BinaryFormatter();
   	  formatterEncode.Binder = new VersionDeserializationBinder();
   	  formatterEncode.Serialize(memoryStream, serializableObject);   
       
			return memoryStream.ToArray();
		} catch (Exception e) {
   			Debug.LogError(e + "Exception caught in encoding");
		}
		
		return null;
	}
	
  public static string SerializeToBase64String(object serializableObject) {
		byte[] byteArray = Serialize(serializableObject);
		return System.Convert.ToBase64String(byteArray);	
	}
	
	public static object Deserialize(byte[] serializedBinary) {
    try {
      MemoryStream memoryStream = new MemoryStream(serializedBinary);
   	  IFormatter formatterDecode = new BinaryFormatter();
      formatterDecode.Binder = new VersionDeserializationBinder();
      memoryStream.Position = 0;
      
   	  return formatterDecode.Deserialize(memoryStream);
		} catch (Exception e) {
   			Debug.LogError(e + "Exception caught in Decoding");
		}
		return null;
	}
	
	public static object DeserializeFromBase64String(string serializedBase64String) {
		byte[] byteArray = System.Convert.FromBase64String(serializedBase64String);
		return Deserialize(byteArray);
	}
	
}
using System;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Reflection;


public sealed class VersionDeserializationBinder : SerializationBinder {
   public override Type BindToType(string assemblyName, string typeName)    {    
       if (!string.IsNullOrEmpty(assemblyName) && !string.IsNullOrEmpty(typeName))  {    
 
         Type typeToDeserialize = null;
         assemblyName = Assembly.GetExecutingAssembly().FullName; 
 
         // The following line of code returns the type.             
         typeToDeserialize = Type.GetType(String.Format("{0}, {1}", typeName, assemblyName));
         return typeToDeserialize;       
       }       
       return null; 
   }
}
using System.Runtime.Serialization;
using System.Security.Permissions;

[System.Serializable]
public class PositionEntity : ISerializable {
	public float positionX;
	public float positionY;
	public float positionZ;
	
	public PositionEntity() {
	}
	
	protected PositionEntity(SerializationInfo info, StreamingContext context)
    {
     	if (info == null) {
       		throw new System.ArgumentNullException("info");
		}
        positionX = (float)info.GetValue("PositionX", typeof(float));
        positionY = (float)info.GetValue("PositionY", typeof(float));
        positionZ = (float)info.GetValue("PositionZ", typeof(float));
    }


    [SecurityPermission(SecurityAction.LinkDemand,
            Flags = SecurityPermissionFlag.SerializationFormatter)]
    public virtual void GetObjectData(
        SerializationInfo info, StreamingContext context)
    {
    	if (info == null) {
        	throw new System.ArgumentNullException("info");
		}
        info.AddValue("PositionX", positionX);
        info.AddValue("PositionY", positionY);
        info.AddValue("PositionZ", positionZ);
    }

}