SerializationException и IOException: нарушение общего доступа к пути - PullRequest
0 голосов
/ 29 марта 2019

Я получаю следующие две ошибки при попытке создать систему сохранения и загрузки для моей игры ..

"SerializationException: тип UnityEngine.MonoBehaviour в сборке UnityEngine.CoreModule, версия = 0.0.0.0, культура = нейтральная, PublicKeyToken = ноль не помечена как сериализуемая. System.Runtime.Serialization.FormatterServices.GetSerializableMembers (тип System.Type, контекст StreamingContext) (по адресу /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization/FormatterServices.cs:101) System.Runtime.Serialization.Formatters.Binary.CodeGenerator.GenerateMetadataTypeInternal (тип System.Type, контекст StreamingContext) (в /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters. /CodeGenerator.cs:78) System.Runtime.Serialization.Formatters.Binary.CodeGenerator.GenerateMetadataType (тип System.Type, контекст StreamingContext) (при

и

IOException: нарушение общего доступа к пути C: \ Users \ Sam \ AppData \ LocalLow \ DefaultCompany \ Game \ test.txt System.IO.FileStream..ctor (путь System.String, режим FileMode, доступ к FileAccess, общий доступ к FileShare, размер буфера Int32, логический аноним, параметры FileOptions) (в / Users / builduser / buildslave / mono / build / mcs / class / corlib /System.IO/FileStream.cs:320) System.IO.FileStream..ctor (путь System.String, режим FileMode) (обертка remoting-invoke-with-check) System.IO.FileStream: .ctor (строка, System.IO.FileMode) SaveSystem.SavePlayer (проигрыватель .Player) (в разделе Assets / Scripts / SaveSystem.cs: 22) Player.SavePlayer () (в разделе Активы / Сценарии / Player.cs: 47) Player.Update () (в разделе Активы / Сценарии / Player.cs: 13)

Вот метод сохранения и загрузки Класс Savesystem ниже

public static class SaveSystem {
public static void SavePlayer (Player player){
    BinaryFormatter formatter = new BinaryFormatter();
    string path = Application.persistentDataPath + "/test.fun";
    FileStream stream = new FileStream(path, FileMode.Create);
    PlayerData data = new PlayerData(player);
    formatter.Serialize(stream, data);
    stream.Close();
}

public static PlayerData LoadPlayer() {
    string path = Application.persistentDataPath + "/test.fun";

    if (File.Exists(path)){
        BinaryFormatter formatter = new BinaryFormatter();
        FileStream stream = new FileStream(path, FileMode.Open);

        PlayerData data = formatter.Deserialize(stream) as PlayerData;
        stream.Close();

        return data;

    } else
    {
        Debug.LogError("Save file not found in " + path);
        return null;
    }
}
}

Любая помощь очень ценится

1 Ответ

0 голосов
/ 30 марта 2019

Я сделал несколько рабочих кодов для вас, я постарался сделать так, чтобы их было так легко редактировать, чтобы вы могли сделать так, чтобы они работали для вашего случая использования.

Edit: Вам нужно создатьпапка SaveData в Assets, иначе она не будет работать, но она также сообщит вам об этом в журнале отладки.

public void SavePlayerData()
{
    // Create the folder path.
    string t_Path = "Assets/SaveData";
    // Specify the file name.
    string t_FileName = "save.txt";

    if( AssetDatabase.IsValidFolder( t_Path ) )
    {
        Debug.Log( "Found: " + t_Path );

        // Create the file path.
        t_FileName = t_Path + "/" + t_FileName;

        if ( AssetDatabase.FindAssets( "save.txt" ).Length > 0)
        {
            // Create the actual text file.
            TextAsset t_NewFile = new TextAsset( "" );
            AssetDatabase.CreateAsset( t_NewFile, t_FileName );
        }          

        // Add text to the created file:
        string t_CopyRight = "" +
        "//////////////////////////////////////  \n" +
        "//    This save file is created     //  \n" +
        "//                by                //  \n" +              // Copyright text.
        "//               Livo               //  \n" +
        "//////////////////////////////////////  \n" +
        " \n";

        string t_Text = "This is the frist text value";             // Random PlayerSaveData text.
        string t_DiffrentText = "This is the second text value";    // Random Level text.
        string t_Location = "x=100,y=0,z=250";                      // Random Transform.position text.
        // You can add your playerdata to these strings.

        t_FileName = t_FileName.Replace( "Assets", "" );
        File.WriteAllText( Application.dataPath + t_FileName,   t_CopyRight + "\n" +
                                                                "[PlayerSaveData]\n" + t_Text + "\n\n" +
                                                                "[Level]\n" + t_DiffrentText + "\n\n" +
                                                                "[Location]\n" + t_Location );
        AssetDatabase.SaveAssets( );
        AssetDatabase.Refresh( );
    }
    else
    {
        Debug.Log( "There is no folder with that name: " + t_Path );
    }
}

Вот как вы можете импортировать данные сохранения:

public void LoadPlayerData()
{
    string t_Path = "Assets/SaveData/save.txt";

    //Read the text from directly from the test.txt file
    StreamReader t_Reader = new StreamReader( t_Path );
    Debug.Log( t_Reader.ReadToEnd( ) );
    t_Reader.Close( );
}

Кстати: код переопределяет данные сохранения при каждом запуске, но я бы сказал, что это то, что вы хотите с файлом сохранения.Если вам нужны другие файлы сохранения, просто динамически присвойте новое имя t_FileName

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...