【问题标题】:Trouble with serialization (The type of the argument object is not primitive)序列化问题(参数对象的类型不是原始的)
【发布时间】:2018-06-22 20:20:42
【问题描述】:

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

InvalidOperationException:参数对象的类型 'ExperimentSettings' 不是原始的。

这是我正在使用的代码(我省略了一些有效的方法,并且与问题没有任何关系):

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();
    }
}

在 Start 函数中,我只是设置了一个按钮,单击该按钮可保存带有一些任意参数的文件。我会把那段代码留在那里,但它与错误无关。

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

[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 中删除所有变量,留下一个空类,但它仍然不起作用。我完全没有想法,非常感谢任何帮助!

【问题讨论】:

  • 说真的,minimal reproducible example 会很有帮助。该异常在一行中抛出,仅显示产生该错误的代码及其上下文。
  • @rene 我编辑了代码以尽可能地匹配您提供的文档
  • 更改XmlSerializer settingsSerializer = new XmlSerializer (typeof(ExperimentSettings));
  • @boran 是的,谢谢,我自己才意识到这一点!

标签: c# xml unity3d serialization evolutionary-algorithm


【解决方案1】:

解决了! 在行中

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2021-12-09
    相关资源
    最近更新 更多