c# - 序列化 List<T> 错误反射(reflect)字段

标签 c# xml serialization

刚接触 xml 序列化,找不到我的具体问题。

使用这段代码序列化:

Human h = new Human();

XmlSerializer writer = new XmlSerializer( typeof( Human ) );

System.IO.StreamWriter file = new System.IO.StreamWriter(
  @"c:\temp\serializerExample.xml" );
writer.Serialize( file, h );
file.Close();

获取内部异常:

{"There was an error reflecting field '_foods'."}

人类:

public class Human : Mammal
{
public string Name
{
  get
  {
    return "Bob";
  }
}
public Human()
{
  this.AddFood( new Hamburger("Name") );
  this.AddFood( new Salad("Name") );
}

和错误谈到的哺乳动物:

  public abstract class Mammal
  {
    public List<Food> _foods = new List<Food>();

    protected void AddFood(Food food)
    {
      _foods.Add( food );
    }

    public void Eat()
    {
      foreach ( var food in _foods )
      {
        food.Eat();
      }
    }
  }

食物:

  [XmlRoot(Namespace="Food")]
  [XmlInclude(typeof(Hamburger))]
  [XmlInclude( typeof( Salad ) )]
  public abstract class Food
  {
    public string PropertyName
    {
      get;
      set;
    }
    public abstract int Calories
    {
      get;
    }
    public abstract void Eat();
    public Food()
    {
    }
    public Food( string propertyName )
    {
      PropertyName = propertyName + " food ";
    }
  }

汉堡包:

public class Hamburger : Food
  {
    public Hamburger()
    {
    }
    public Hamburger(string propertyName) :base(propertyName)
    {

    }
    public override int Calories
    {
      get
      {
        return 500;
      }
    }

    public override void Eat()
    {
      Console.WriteLine( "Eat Hamburgers" );
    }
  }

沙拉:

  public class Salad : Food
  {
    public Salad(string propertyName) : base(propertyName)
    {

    }
    public override int Calories
    {
      get
      {
        return 200;
      }
    }

    public override void Eat()
    {
      Console.WriteLine( "Eat Salad" );
    }
  }

最佳答案

我认为 Salad 缺少一个 Default(无参数)构造函数

public class Salad : Food
  {
    public Salad (){}

    public Salad(string propertyName) : base(propertyName)
    {

    }
    public override int Calories
    {
      get
      {
        return 200;
      }
    }

    public override void Eat()
    {
      Console.WriteLine( "Eat Salad" );
    }
  }

关于c# - 序列化 List<T> 错误反射(reflect)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19891390/

相关文章:

c# - 基于数组生成动态LINQ表达式

c# - 等到 BlockingCollection 队列被后台线程清除,如果时间太长则超时?

java - 有没有像 Schematics (Python) for Java 这样的工具?

java - java程序可以读取C#序列化的对象吗?

c# - 是否可以在 c# 中创建一个合并接口(interface)的工厂?

java - 如何删除 XML 中作为 XML 消息一部分的 < 和 >

python - 我可以使用 ElementTree 获取 XML 文件的完整结构吗?

java - XML 到 JSON - 丢失根节点

c++ - Boost::serialize - 反序列化对象 vector ?

c# - 如何知道 PropertyInfo 是否是一个集合