Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何反序列化类以添加信息,然后保存_C#_Serialization_Unity3d_Filestream_Binaryformatter - Fatal编程技术网

C# 如何反序列化类以添加信息,然后保存

C# 如何反序列化类以添加信息,然后保存,c#,serialization,unity3d,filestream,binaryformatter,C#,Serialization,Unity3d,Filestream,Binaryformatter,我得到了一个可序列化的类,它正在被另一个类实例化,但我真正希望它做的是首先打开以前保存的文件,并在列表中添加一个新元素,但我得到的只是覆盖以前的信息,然后保存(我不希望这样,所以我从filemode.open更改为filemode.append)。因此,每次游戏结束时都会调用反序列化类,我希望它能打开一个高分并添加一个新元素 我的问题从反序列化开始 using UnityEngine; using UnityEngine.EventSystems; using System.Collection

我得到了一个可序列化的类,它正在被另一个类实例化,但我真正希望它做的是首先打开以前保存的文件,并在列表中添加一个新元素,但我得到的只是覆盖以前的信息,然后保存(我不希望这样,所以我从filemode.open更改为filemode.append)。因此,每次游戏结束时都会调用反序列化类,我希望它能打开一个高分并添加一个新元素

我的问题从反序列化开始

using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine.UI;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

public class LeaderboardManager : MonoBehaviour, IPointerDownHandler, IPointerUpHandler  {
    public GameObject leaderboardart;
    public static LeaderboardManager leaderboardmanager;
    void Awake() 
    {
        if (leaderboardmanager == null) 
        {
            DontDestroyOnLoad (gameObject);
            leaderboardmanager = this;
        } else if (leaderboardmanager!= this) {
            Destroy (gameObject);
        }

        if (File.Exists (Application.persistentDataPath + "/highscores.dat")) 
        {
            print("THE HIGHSCORES HAS BEEN CREATED");
        } 
        else 
        {
            PlayerData playdata = new PlayerData();
            FileStream file = File.Create(Application.persistentDataPath +"/highscores.dat");
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(file,playdata);
            file.Close();
        }
    }


    public void  Deserialize(int score) 
    {
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Open(Application.persistentDataPath + "/highscores.dat", FileMode.Append);
        PlayerData playdata = (PlayerData)bf.Deserialize(file);
        playdata.highscorelist.Add (score);
        bf.Serialize (file, playdata);
        file.Close ();
    }

    [Serializable]
    class PlayerData 
    {
        public List<int> highscorelist = new List<int>();
    }
}

您使用.Append标志打开流,这是一种写入模式,因此您的二进制格式化程序正确地抱怨它无法从仅为写入而打开的流中读取。试试这个代码。它首先以读取模式打开highscore文件,然后在更新类中的highscore后,以写入模式第二次打开highscore文件以序列化所有数据

不要使用append。二进制格式不仅仅像CSV格式那样可以附加额外的行。你必须重写整个文件

        BinaryFormatter bf = new BinaryFormatter();
        PlayerData playdata;

        using (FileStream file = File.Open("highscores.dat", FileMode.Open))
        {
            playerData = (PlayerData) bf.Deserialize(file);
        }

        playdata.highscorelist.Add(score);

        using (FileStream file = File.Open("highscores.dat", FileMode.Create))
        {
            bf.Serialize(file, playdata);
        }

下次请多花点时间格式化您的问题。它以前基本上是不可读的。除了正确的格式,将来还请从您的示例中删除不相关的代码。这只会让人困惑,你的问题会被否决。对不起,这是我第二次问问题。谢谢你的改进提示:你可以随时编辑你的问题,这样以后看这个问题的人就不必阅读50%不相关的代码。谢谢chris,我下班后会试试这个。
        BinaryFormatter bf = new BinaryFormatter();
        PlayerData playdata;

        using (FileStream file = File.Open("highscores.dat", FileMode.Open))
        {
            playerData = (PlayerData) bf.Deserialize(file);
        }

        playdata.highscorelist.Add(score);

        using (FileStream file = File.Open("highscores.dat", FileMode.Create))
        {
            bf.Serialize(file, playdata);
        }