c# - 序列化问题(参数对象的类型不是原始类型)

标签 c# xml unity3d serialization evolutionary-algorithm

我正在编写进化算法,但在 XML 文件中写入某些项目时遇到问题。我收到的错误是

InvalidOperationException: The type of the argument object 'ExperimentSettings' is not primitive.

这是我正在使用的代码(我遗漏了一些有效但与问题无关的方法):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

public class SerializerTest : MonoBehaviour {

    public GameObject spawner;

    // Use this for initialization
    void Start () {
        GetComponent<Button>().onClick.AddListener(delegate { Save(false, 0, 50, 5, 5, 50, 5, new Vector3(0, 20, 0), new System.IO.DirectoryInfo("/Experiments/Test #0"), spawner.GetComponent<CreatureGenerator>()); });
    }

    // Use this for initialization
    void Save(
        bool startCreatures,
        int experimentType,
        int totalCreaturesNo,
        int cycles,
        float experimentDuration,
        float survivorsPercentage,
        float probabilityOfMutation,
        Vector3 creaturesStartingPosition,
        DirectoryInfo saveFolder,
        CreatureGenerator generator
        )
    {
        //create file where to save the settings
        string settingsFile = Application.dataPath + saveFolder + "/settings_and_parameters.xml";

        if (File.Exists(settingsFile))
        {
            File.Delete(settingsFile);
        }

        XmlSerializer settingsSerializer = new XmlSerializer(typeof(Creature));
        FileStream settingsStream = new FileStream(settingsFile, FileMode.Create);

        //save the settings
        ExperimentSettings thisExperiment = new ExperimentSettings()
        {
            startCreatures = startCreatures,
            experimentType = experimentType,
            totalCreaturesNo = totalCreaturesNo,
            cycles = cycles,
            experimentDuration = experimentDuration,
            survivorsPercentage = survivorsPercentage,
            probabilityOfMutation = probabilityOfMutation,
            creaturesStartingPosition = creaturesStartingPosition,
            saveFolder = new DirectoryInfo(saveFolder.ToString()),
            experimentScene = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name
        };

        settingsSerializer.Serialize(settingsStream, thisExperiment);

        //close the file
        settingsStream.Close();
    }
}

在“开始”功能中,我只是设置了一个按钮,单击该按钮可保存带有一些任意参数的文件。我会将该代码留在那里,但它与错误无关。

这是序列化时返回错误的类:

[System.Serializable]
public class ExperimentSettings
{
    public bool startCreatures;
    public int experimentType;
    public int totalCreaturesNo;
    public int cycles;
    public float experimentDuration;
    public float survivorsPercentage;
    public float probabilityOfMutation;
    public Vector3 creaturesStartingPosition;
    public DirectoryInfo saveFolder;
    public string experimentScene;
}

让我感到困惑的是,我尝试以与实际工作相同的方式在同一方法中序列化另一个类。下一个代码块是正确序列化的类:

[System.Serializable]
public class Creature
{
    public string creaturePrefab;
    public double result;
    public bool passed;
}

我尝试从 ExperimentSettings 中删除所有变量,留下一个空类,但它仍然不起作用。我完全没有想法,非常感谢任何帮助!

最佳答案

解决了! 在行中

 XmlSerializer settingsSerializer = new XmlSerializer(typeof(Creature)); 

我从我自己的代码中复制粘贴但我忘记更改类,所以要解决这个特定问题我必须以这种方式编辑这一行

XmlSerializer settingsSerializer = new XmlSerializer(typeof(ExperimentSettings));

关于c# - 序列化问题(参数对象的类型不是原始类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48242046/

相关文章:

c# - LINQ 成员表达式获取列名

c# - 具有单个和多个 SaveChanges() 调用的 Entity Framework (6) 事务之间有什么区别

c# - 无法找到 testhost.dll。请发布您的测试项目并重试

java - 用 Jaxb 重复标签

android - Cardboard的YouTube视频流(统一)

c# - Moq 模拟泛型和表达式函数

python - 用 python 抓取一些 ofx 数据

php - 如何将XML文件导入MariaDB数据库?

c# - 检测我是否点击了文本的特定部分

c# - 没有网格的盒子对撞机和 Physics.Raycast