未标记为Serializable错误

4

我有一个名为“Entity”的类。

[Serializable]
public class Entity
{
   public Guid Id { get; set; }
   public IEnumerable<Entity> ChildEntity { get; set; } 
}

我注意到它具有属性ChildEntity,这是一个相同类Entity的列表。
问题1. 我是否需要显式序列化此列表?或者类上的Serializable属性会为我完成这项工作。
现在,当我尝试使用二进制序列化器对此类进行序列化时,我会收到异常,指出此类未标记为可序列化。
我认为当它尝试序列化childEntities时会出现异常。
以下是我的序列化代码。
public static T DeepClone<T>(T obj)
{
    using (var ms = new MemoryStream())
    {
        var formatter = new BinaryFormatter();

        try
        {
            formatter.Serialize(ms, obj);
        }
        catch (Exception Ex)
        {
           //TODO
    }
    }
}

我还有一个类,用于填充实体类列表。
[Serializable]
public class AllEntity
{
    public Guid ParentId {get; set; }
    public Guid Id {get; set;} //childId
    public string Desc {get; set;}
}

我正在执行递归操作,根据父子关系构建实体类列表。

public IEnumerable<Entity> Build(IEnumerable<AllEntity> allentity)
{
    //recursivey builds List if Entity class
}
异常消息:

程序集'System.Core, Version=4.0.0.0, Culture=neutral, Token=null'中的类型'System.LINQ.Enumerable+WhereSelectListIterator`2[[Common.Models.AllEntity, Common, Version=1.0.0.0, Culture=neutral, Token=null],[Common.Models.Entity, Common, Version=1.0.0.0, Culture=neutral, Token=null]]'没有被标记为可序列化


请将你的完整代码贴出来,让我来查看。 - Vijay Raheja
1
你的问题在于 IEnumerable<Entity> ChildEntity 实际上并不是指向一个 List<ChildEntity>,而是指向 .Where() linq 查询的未评估结果。在序列化之前使用 ToList() 来实现它。 - dbc
@dbc 你是救星!! :D - siddharth
@siddharth - 我应该把它做成一个答案吗? - dbc
@dbc 是的,那解决了我的问题。 - siddharth
显示剩余3条评论
2个回答

5
根据异常信息,您遇到的问题是至少有一个实体实例中的 IEnumerable<Entity> ChildEntity 属性并不实际指向一个 List<ChildEntity>,而是指向了一个未评估的 .Where() LINQ 查询结果。在存储之前,请使用 ToList() 来使其具体化(Materialize)。

0

我已经检查了下面的代码,它运行良好。

Entity ea = new Entity();
ea.Id = Guid.NewGuid();
var li = new List<Entity>();
li.Add(new Entity { Id = Guid.NewGuid() });
ea.ChildEntity = li;
DeepClone<Entity>(ea);

你只需要将类标记为 [Serializable]。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接