Сохранение объектов с конструктором в XML - PullRequest
0 голосов
/ 06 сентября 2018

Привет всем, мне нужна помощь. Что мне нужно изменить в этом коде, чтобы иметь возможность сериализовать (сохранить) этот файл? Я пытаюсь создать файл инвентаря, который будет сохранять созданные предметы (этот, в частности, сохраняет созданные компоненты), у меня есть почти идентичный код для сохранения созданного оружия. Поиск в сети Я не смог найти способ сериализации этого объекта, потому что он использует параметры, но мне нужно добавить данные в этот список и сохранить его. Есть ли способ обойти это? если да как? СПАСИБО!

ошибка, которую я получаю:

InvalidOperationException: ComponentDB.ItemEntry не может быть сериализовано, поскольку у него нет конструктора без параметров.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System;
using System.Linq;

public class ComponentDB : MonoBehaviour
{

    public ItemDatabase itemDB;
    public string Slot;
    public static ComponentDB ins;

    void Awake()
    {
        ins = this;
        Slot = "Slot1";
    }

    public void SaveItems()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(ItemDatabase));
        FileStream stream = new FileStream(Application.dataPath + "/StreamingAssets/Save/" + Slot + "CraftedComp.xml", FileMode.Create);
        serializer.Serialize(stream, itemDB);
        stream.Close();
    }
    public void LoadItems()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(ItemDatabase));
        FileStream stream = new FileStream(Application.dataPath + "/StreamingAssets/Save/" + Slot + "CraftedComp.xml", FileMode.Open);
        itemDB = serializer.Deserialize(stream) as ItemDatabase;
        stream.Close();
    }

    [Serializable]
    public class ItemEntry
    {
        public string Name;
        public string Data;
        public int Amount;


        public ItemEntry(string iName, string idata, int iAmount)
        {
            Name = iName;
            Data = idata;
            Amount = iAmount;
        }
    }

    [Serializable]
    public class ItemDatabase
    {
        public List<ItemEntry> list = new List<ItemEntry>();
    }

    public void ManageItemsInv(string input_name, string input_list,  int input_amount)
    {

        ins.itemDB.list.Add(new ItemEntry(input_name, input_list,  input_amount));
    }
}

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Создайте ItemEntryModel, который не содержит конструктор, просто свойство переменной, и создайте ItemDatabaseModel, который содержит список, и попробуйте сериализовать объект itemDatabase как ItemDatabaseModel, я думаю, что это решит проблему

0 голосов
/ 06 сентября 2018

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

Решение довольно простое: создайте конструктор без параметров в классе ItemEntry:

        [Serializable]
        public class ItemEntry
        {
            public string Name;
            public string Data;
            public int Amount;

            //parameterless constructor for XmlSerializer
            public ItemEntry()
            {
            }

            public ItemEntry(string iName, string idata, int iAmount)
            {
                Name = iName;
                Data = idata;
                Amount = iAmount;
            }
        }
...