首页 > 解决方案 > 编辑器中的 Unity 自定义类

问题描述

我在二进制保存系统中保存自定义类时遇到问题。

这是我的 SaveLoadManager.cs 进行二进制保存:

public static class SaveLoadManager 
{
    private static string saveFileName = "/SpaceClicker.sav";


    public static bool Save(PlayerData data)
    {
        BinaryFormatter binaryFormatter = GetBinaryFormatter();

        FileStream stream = File.Create(Application.persistentDataPath + saveFileName);

        binaryFormatter.Serialize(stream, data);

        stream.Close();

        return true;
    }

    public static PlayerData Load()
    {
        if (!File.Exists(Application.persistentDataPath + saveFileName))
        {
            return null;
        }

        BinaryFormatter binaryFormatter = GetBinaryFormatter();

        FileStream stream = new FileStream(Application.persistentDataPath + saveFileName, FileMode.Open);

        try
        {
            PlayerData data = binaryFormatter.Deserialize(stream) as PlayerData;
            stream.Close();
            return data;
        }
        catch
        {
            Debug.LogErrorFormat("Failed to load file at {0}", Application.persistentDataPath + saveFileName);
            stream.Close();
            return null;
        }
    }

    private static BinaryFormatter GetBinaryFormatter()
    {
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        return binaryFormatter;
    }

SaveLoadHandler.cs:在这里我只是保存和加载。

这里也是我的自定义类“UpgradeClass”和我的公共变量 factoryUpgradeClass,它有 UpgradeClass。

public PlayerData data;

    void Awake()
    {
        if (SaveLoadManager.Load() != null)
        {
            data = SaveLoadManager.Load();
        }
        
    }

    void Update()
    {
        SaveLoadManager.Save(data);
    }
}

[Serializable]
public class UpgradeClass
{
    public GameObject ob;
    public string upname;

    public bool bought;

    public UpgradeClass(GameObject ob, string upname, bool bought)
    {
        this.ob = ob;
        this.upname = upname;
        this.bought = bought;
    }
}

[Serializable]
public class PlayerData
{
   //Lots of values
   public List<UpgradeClass> factoryUpgradeClass;
}

问题是当我开始游戏时出现以下 2 个错误:

  1. 错误:
SerializationException: Type 'UnityEngine.GameObject' in Assembly 'UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers (System.RuntimeType type) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.FormatterServices+<>c__DisplayClass9_0.<GetSerializableMembers>b__0 (System.Runtime.Serialization.MemberHolder _) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Collections.Concurrent.ConcurrentDictionary`2[TKey,TValue].GetOrAdd (TKey key, System.Func`2[T,TResult] valueFactory) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.FormatterServices.GetSerializableMembers (System.Type type, System.Runtime.Serialization.StreamingContext context) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo () (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize (System.Object obj, System.Runtime.Serialization.ISurrogateSelector surrogateSelector, System.Runtime.Serialization.StreamingContext context, System.Runtime.Serialization.Formatters.Binary.SerObjectInfoInit serObjectInfoInit, System.Runtime.Serialization.IFormatterConverter converter, System.Runtime.Serialization.Formatters.Binary.ObjectWriter objectWriter, System.Runtime.Serialization.SerializationBinder binder) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize (System.Object obj, System.Runtime.Serialization.ISurrogateSelector surrogateSelector, System.Runtime.Serialization.StreamingContext context, System.Runtime.Serialization.Formatters.Binary.SerObjectInfoInit serObjectInfoInit, System.Runtime.Serialization.IFormatterConverter converter, System.Runtime.Serialization.Formatters.Binary.ObjectWriter objectWriter, System.Runtime.Serialization.SerializationBinder binder) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write (System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo objectInfo, System.Runtime.Serialization.Formatters.Binary.NameInfo memberNameInfo, System.Runtime.Serialization.Formatters.Binary.NameInfo typeNameInfo) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize (System.Object graph, System.Runtime.Remoting.Messaging.Header[] inHeaders, System.Runtime.Serialization.Formatters.Binary.__BinaryWriter serWriter, System.Boolean fCheck) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (System.IO.Stream serializationStream, System.Object graph, System.Runtime.Remoting.Messaging.Header[] headers, System.Boolean fCheck) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (System.IO.Stream serializationStream, System.Object graph, System.Runtime.Remoting.Messaging.Header[] headers) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (System.IO.Stream serializationStream, System.Object graph) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
SaveLoadManager.Save (PlayerData data) (at Assets/Scripts/DataSaving/SaveLoadManager.cs:22)
SaveLoadHandler.Update () (at Assets/Scripts/Handlers/SaveLoadHandler.cs:33)

  1. 错误:
IOException: Sharing violation on path C:\Users\mmorp\AppData\LocalLow\DefaultCompany\SpaceClicker\SpaceClicker.sav
System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
(wrapper remoting-invoke-with-check) System.IO.FileStream..ctor(string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,int)
System.IO.File.Create (System.String path, System.Int32 bufferSize) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
System.IO.File.Create (System.String path) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
SaveLoadManager.Save (PlayerData data) (at Assets/Scripts/DataSaving/SaveLoadManager.cs:20)
SaveLoadHandler.Update () (at Assets/Scripts/Handlers/SaveLoadHandler.cs:33)

它指的是行:“SaveLoadManger.Save(data)”。结果是无法加载保存文件。

我搜索了很多,也许我需要做一个自定义编辑器?谁能帮我解决这个问题?

提前致谢!

标签: c#unity3dserialization

解决方案


推荐阅读