C# 反序列化返回类的字段而不是类

C# 反序列化返回类的字段而不是类,c#,serialization,deserialization,binary-serialization,C#,Serialization,Deserialization,Binary Serialization,我有一个名为Schematic的类,它存储了用于我的游戏的块结构。我试图找到一种使用BinaryFormatter保存和加载它们的方法,但是我在反序列化方面遇到了一个问题。当我反序列化时,我不能强制转换到我的源类型,相反,它只允许我得到一个字段,一个二维整数数组 下面是schematic类的代码: [Serializable] public class Schematic { public static Schematic BlankSchematic = new Schematic("

我有一个名为Schematic的类,它存储了用于我的游戏的块结构。我试图找到一种使用BinaryFormatter保存和加载它们的方法,但是我在反序列化方面遇到了一个问题。当我反序列化时,我不能强制转换到我的源类型,相反,它只允许我得到一个字段,一个二维整数数组

下面是schematic类的代码:

[Serializable]
public class Schematic
{
    public static Schematic BlankSchematic = new Schematic("BLANK");
    public int[,] Blocks;
    public V2Int Size;
    public V2Int Location = V2Int.zero;

    public string Name;

    //---PROPERTIES---
    //lower is more rare
    public int Rarity = 100;
    //---END PROPERTIES---

    public Schematic(string name)
    {
        Name = name;
    }
    public Schematic(string name, int[,] blocks)
    {
        Name = name;
        ModifyBlockArray(blocks);
    }
    public void ModifyBlockArray(int[,] newBlocks)
    {
        Blocks = newBlocks;
        Size = new V2Int(newBlocks.GetLength(0), newBlocks.GetLength(1));
    }
}
我的方法在一个单独的类中进行序列化和反序列化:

public void SaveSchematic(Schematic schem)
{
    using (Stream stream = new FileStream(SchematicsDirectory + "/" + schem.Name + ".schem", FileMode.Create, FileAccess.Write, FileShare.None))
    {
        BinaryFormatter bf = new BinaryFormatter();
        Debug.Log(schem.GetType());
        bf.Serialize(stream, schem);
    }

}

public void LoadSchematics(string dir)
{
    BinaryFormatter bf = new BinaryFormatter();

    DirectoryInfo info = new DirectoryInfo(dir);
    FileInfo[] fileinfo = info.GetFiles("*.schem");
    for (int i = 0; i < fileinfo.Length; i++)
    {
        FileStream fs = new FileStream(dir + fileinfo[i].Name, FileMode.Open);
        object tempO = bf.Deserialize(fs);
        Debug.Log(tempO + ", " + tempO.GetType());
        Schematic temp = (Schematic)tempO;
        SchematicsByName.Add(temp.Name, temp);
        Schematics.Add(temp);
        print("Loaded Schematic: " + temp.Name);
        fs.Close();
        fs.Dispose();
    }
}
V2Int也被标记为可序列化。当我反序列化时,我得到的是块数组,而不是整个类,这真的很奇怪。任何帮助都将不胜感激


这是我在这里发表的第一篇文章,如果我犯了任何错误,我深表歉意。

我用一个示例代码段进行了尝试,并对其进行了正确的序列化和反序列化。请确保要发送的原理图对象具有所有正确的开始值。总的来说

反序列化对象是最终值的最佳匹配。不要查看序列化文件。 此外,如果反序列化了错误的类型,此行通常会引发强制转换异常

Schematic temp = (Schematic)tempO;
因此,请执行以下代码片段并让我们知道。 这对我来说很有效。(我根据构造函数设计了一个随机的V2Int类)


我用一个示例代码段进行了尝试,并对其进行了正确的序列化和反序列化。请确保要发送的原理图对象具有所有正确的开始值。总的来说

反序列化对象是最终值的最佳匹配。不要查看序列化文件。 此外,如果反序列化了错误的类型,此行通常会引发强制转换异常

Schematic temp = (Schematic)tempO;
因此,请执行以下代码片段并让我们知道。 这对我来说很有效。(我根据构造函数设计了一个随机的V2Int类)


无论我在哪里看都看不到错误,这对于第一个问题来说非常好!干得好我在其中添加了二进制序列化标记,认为可以方便地指定标记中已有的序列化类型。请同时发布V2Int类的定义。我在任何地方都看不到错误,这对于第一个问题非常好!干得好我在其中添加了二进制序列化标记,认为可以方便地指定标记中已经存在的序列化类型。请同时发布V2Int类的定义。不知道为什么以前它不起作用,只是再次尝试(没有更改),现在它起作用了。也许我的电脑只是疯了,哈哈。谢谢你的回复。酷。作为附加输入,您不需要执行fs.close、fs.dispose。。c#使使用“using”关键字变得更容易。。自动一次性。。使用(var fs=new FileStream(dir+fileinfo[i].Name,FileMode.Open)){object tempO=bf.Deserialize(fs);Debug.Log(tempO+”,“+tempO.GetType());Schematic temp=(Schematic)tempO;SchematicsByName.Add(temp.Name,temp);Schematics.Add(temp);打印(“加载的原理图:+temp.Name);}不知道为什么之前它不工作,只是再次尝试(没有更改),现在它工作了。也许我的电脑只是疯了,哈哈。谢谢你的回复。酷。作为附加输入,您不需要执行fs.close、fs.dispose。。c#使使用“using”关键字变得更容易。。自动一次性。。使用(var fs=new FileStream(dir+fileinfo[i].Name,FileMode.Open)){object tempO=bf.Deserialize(fs);Debug.Log(tempO+”,“+tempO.GetType());Schematic temp=(Schematic)tempO;SchematicsByName.Add(temp.Name,temp);Schematics.Add(temp);打印(“加载的原理图:+temp.Name);}
    public static string SchematicsDirectory = "d:\\temp\\s";

    static void Main(string[] args)
    {
        var p = new Program();

        var array = new int[2, 2];
        array[0, 0] = 1;
        array[0, 1] = 2;
        array[1, 0] = 3;
        array[1, 1] = 4;

        var testObject = new Schematic("fezzik", array);

        p.SaveSchematic(testObject);
        p.LoadSchematics(SchematicsDirectory + "/");
    }