【问题标题】:C# Serialization: save List with objects of type Action to fileC# 序列化:将具有 Action 类型的对象的 List 保存到文件
【发布时间】:2017-03-27 11:44:29
【问题描述】:

序列化有问题。

我的列表如下:

 public List<Action> functions = new List<Action>();

稍后我只是将对象添加到列表中:

functions.Add(waypoint1);

我的序列化按钮看起来像:

 private async void metroButton8_Click(object sender, EventArgs e) // save wpts button
        {
            string dir = @"c:\temp";
            string serializationFile = Path.Combine(dir, "wpts.bin");
            //serialize
            using (Stream stream = File.Open(serializationFile, FileMode.Create))
            {
                var bformatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

                bformatter.Serialize(stream, functions);
            }

        }


void Waypoint1()
{
Console.WriteLine("Im first waypoint");
}

当我尝试保存到文件时出现错误: mscorlib.dll 中出现“System.Runtime.Serialization.SerializationException”类型的异常,但未在用户代码中处理

我应该在这里添加什么只是不知道搜索了很多论坛并且仍然不知道。 c#新手请耐心等待。 谢谢!

【问题讨论】:

  • 你能举一个 Waypoint1 动作的例子吗?它应该做什么,为什么要序列化它?
  • @up 这并不重要,但我为你编辑了我的主要内容。

标签: c# object serialization


【解决方案1】:

并非所有对象都可以序列化。动作不可序列化。

您可以找到更多信息here 或阅读此answer

在某些情况下,您可以通过简单的方式做到这一点。 您可以拥有 MyAction 列表,而不是拥有 Action 列表。 MyAction 在哪里:

public class MyAction
{
    //there could be several fields with data for Execute method.
    //Type of this fields should be serializable.
    public string DataForExecute { get; set; }

    public void Execute()
    {
        //Do all you need here...
    }
}

您甚至可以从此类继承并具有层次结构。但它使序列化/反序列化更加复杂。

【讨论】:

  • 所以我只需要创建一个可序列化的“东西”。我可以使用什么来获取与列表中现在相同的内容。 (方法对象的Luist。)
  • @Michael 序列化 deligate 不是一件容易的事。 hereLBushkin 提出了一些通用方法并描述了为什么它在一般情况下不起作用。
  • 好的,我明白了,但是我可以使用其他东西来获取方法对象列表而不使用委托吗?
  • @Michael 好吧,最简单的方法是创建一个可序列化的类 MyAction,它将具有 Execure 方法以及在具有公共 getter 和 setter 的属性中执行所需的所有数据,并具有这些对象的列表。如果它适用于您的情况。如果需要,我可以编辑我的答案并添加示例。
  • Chepikov 是的,请这样做。
猜你喜欢
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
相关资源
最近更新 更多