zoukankan      html  css  js  c++  java
  • Unity3d Serialize问题

    备忘:

    1. ScriptableOjbect中,由于Serialization的原因,不能使用基类引用来存储子类对象,这样都会导致数据丢失

    2. 无法直接对Unity的数据如,vector3, quaternion等使用BinaryFormatter进行序列化,会报“SerializationException: Type UnityEngine.Vector3 is not marked as Serializable”。要绕过这个问题的姿势是,自己对Vector3进行包装。下面是其中一种方法

     1 using System;
     2 using System.Runtime.Serialization;
     3 using UnityEngine;
     4 
     5 namespace Assets.Editor
     6 {
     7     sealed class Vector3SerializationSurrogate : ISerializationSurrogate
     8     {
     9 
    10 
    11 
    12         public void GetObjectData(object obj, System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
    13         {
    14             Vector3 v3 = (Vector3)obj;
    15             info.AddValue("x", v3.x);
    16             info.AddValue("y", v3.y);
    17             info.AddValue("z", v3.z);
    18         }
    19 
    20         public object SetObjectData(object obj, System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context, System.Runtime.Serialization.ISurrogateSelector selector)
    21         {
    22             Vector3 v3 = (Vector3)obj;
    23             v3.x = (float)info.GetValue("x", typeof(float));
    24             v3.y = (float)info.GetValue("y", typeof(float));
    25             v3.z = (float)info.GetValue("z", typeof(float));
    26             
    27             return (object)v3;
    28         }
    29     }
    30 }
     1 public static void TestFunc()
     2         {
     3             BinaryFormatter bf = new BinaryFormatter();
     4             SurrogateSelector ss = new SurrogateSelector();
     5 
     6             Vector3SerializationSurrogate v3Surrogate = new Vector3SerializationSurrogate();
     7             ss.AddSurrogate(typeof(Vector3), new StreamingContext(StreamingContextStates.All), v3Surrogate);
     8 
     9             bf.SurrogateSelector = ss;
    10 
    11             MemoryStream stream = new MemoryStream();
    12 
    13             Vector3 testObj = new Vector3(1, 2, 3);
    14             bf.Serialize(stream, testObj);
    15             stream.Position = 0;
    16             Vector3 resultObj = (Vector3)bf.Deserialize(stream);
    17             Debug.Log(resultObj);
    18         }
  • 相关阅读:
    SpringBoot常用注解(二)
    SpringBoot常用注解(一)
    Spring Dl解释
    Spring 入门程序
    Spring 入门
    JUnit-4.13使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
    测试中Android与IOS分别关注的点
    python包中__init__.py的作用
    python自动发送测试报告(五)
    搭建一个有条理的项目(四)
  • 原文地址:https://www.cnblogs.com/bicker/p/4478086.html
Copyright © 2011-2022 走看看