@Mui

Как сохранить данные в один бинарный файл?

Имеется класс Cell:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class Cell
{

  public List<int> neighbors = new List<int>();
  public int index;

}

Чтобы сохранить данные:
public void SaveData()
{
  
  Cell data = CreateDataGameObject(); // инициализирует данные ячейки

  BinaryFormatter bf = new BinaryFormatter();
  FileStream file = File.Create(Application.persistentDataPath + "/celldate.dat");
  bf.Serialize(file, data);
  file.Close();
}


А как сохранить List cells - в один файл?
  • Вопрос задан
  • 362 просмотра
Решения вопроса 2
freeExec
@freeExec
Участник OpenStreetMap
Создать новый класс со списком клеток и сериализовывать его. Либо вы можете вручную управлять данными и на сериализацию отправлять то те байты, которые включают только одну клетку.

П.С. Но я бы рекомендовал не изобретать велосипед, а воспользоваться встроенными в юнити ассетами на ScriptableObject.
Ответ написан
Комментировать
shai_hulud
@shai_hulud
выберите любой из предоставленных ассетов для бинарных форматов и скормите ему ваши классы/списки:
https://assetstore.unity.com/search?q=bson или
https://assetstore.unity.com/search?q=messagepack
Хотя на самом деле JSON местами компактнее BSON, и его тоже можно использовать. JSON.NET неплох. Если нужна мультиплатформа то вот JSON & MessagePack работает везде.

И не используйте BinaryFormatter, получите много разной боли при смене стуктуры классов, имен, версий. Юнитевский форматтер в JSON не лучше.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AGlassOfWhiskey
@AGlassOfWhiskey
Unity Game Developer (c#)
В рамках данной задачи предлагаю использовать Newtonsoft.
Установить пакет можно через NuGet в вижле.

class Program
    {
        const string pathData = @"c:\data.dat";
        static void Main(string[] args)
        {
            WriteData(GenerateData());
            DisplayListData(ReadData());
            Console.ReadLine();
        }

        static List<Cell> GenerateData()
        {
            List<Cell> dataCell = new List<Cell>();
            for (int i = 1; i <= 5; i++)
            {
                int val = i * 10;
                Cell cell = new Cell()
                {
                    neighbors = new List<int>() {val, val + 1, val + 2},
                    index = i
                };
                dataCell.Add(cell);
            }
            return dataCell;
        }

        static void WriteData(List<Cell> dataCell)
        {
            using (StreamWriter file = File.CreateText(pathData))
            {
                JsonSerializer serializer = new JsonSerializer();
                serializer.Serialize(file, dataCell);
            }
            Console.WriteLine("Save Data in PATH: " + pathData);
        }

        static List<Cell> ReadData()
        {
            using (StreamReader file = File.OpenText(pathData))
            {
                JsonSerializer serializer = new JsonSerializer();
                return (List<Cell>) serializer.Deserialize(file, typeof(List<Cell>));
            }
        }

        static void DisplayListData(List<Cell> dataList)
        {
            Console.WriteLine(new String('-', 5));
            foreach (var cell in dataList)
            {
                Console.WriteLine("Cell index: " + cell.index);
                Console.WriteLine(new String('-', 5));
                for (int i = 0; i < cell.neighbors.Count; i++)
                {
                    Console.WriteLine("Value index: " + i + " = " + cell.neighbors[i].ToString());
                }
                Console.WriteLine(new String('-', 5));
            }
        }
    }

    [Serializable]
    public class Cell
    {
        public List<int> neighbors { get; set; }
        public int index { get; set; }
    }


Думаю общий принцип понятен.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы