【问题标题】:IQueryable<> Serialization - C#-VS2008-WCFIQueryable<> 序列化 - C#-VS2008-WCF
【发布时间】:2009-05-06 18:37:57
【问题描述】:

我使用所需的表构建了我的 *.dbml 文件并生成了关系,1 到多个。

我的 WCF 服务库中的一个方法有这个查询

 IQueryable<Client>localClient = from c in db.Clients
              where c.ClientID.Equals(2612)
              select c;

 foreach(Client currentClient in localClient)
 {
    //Call serialize method here
 }

客户具有一对多关系的表之一是客户 - 员工

使用“localClient”,我想将其序列化并返回给调用者。但是它告诉我无法形成 XML 文档。

这是内部异常: 序列化 TestDB_Public.Employee 类型的对象时检测到循环引用。

我的序列化代码

    public string Serialize(object o, XmlSerializerNamespaces ns)
    {
        try
        {
            System.IO.MemoryStream m = new System.IO.MemoryStream();

            if (ns != null)
                serializer.Serialize(m, o, ns);
            else
                serializer.Serialize(m, o);

            m.Position = 0;
            byte[] b = new byte[m.Length];
            m.Read(b, 0, b.Length);

            return System.Text.UTF8Encoding.UTF8.GetString(b);
        }
        catch (Exception ex)
        {
            return "Ex = " + ex.ToString();
        }
    }

IQueryable 的序列化是否不可能具有一对多的关系?

【问题讨论】:

  • 似乎没有理由将集合类型设为 IQueryable。相反,使用 var 并在查询结束时调用 .ToList() 方法。即使这不起作用,它也会使实际查询执行的重点更加明确和清晰
  • 这条评论真的很有帮助,Josh E。我恳请你充实它并重新提交它作为答案。保证投票!

标签: c# wcf


【解决方案1】:

错误信息到底是什么?请注意,您必须序列化具体的东西,例如对象列表或数组(不是查询)。

如果您想通过网络进行查询,请查看执行此操作的 ADO.NET 数据服务。

另外 - 您是否在 dbml 设计器中将序列化模式设置为“单向”?只要没有循环,它应该可以正常工作。

【讨论】:

  • Marc:这是 Innerexxception:在序列化 TestDB_Public.Employee 类型的对象时检测到循环引用。我确实将其设置为单向。 ADO.NET 数据服务是不行的,因为大佬们认为它可能不够安全
  • 循环引用是我害怕的循环——例如,如果一个员工可以看到他们的经理,而经理可以看到他们的下属,它就会进入一个状态。不过可以开启DataContractSerializer的图序列化模式:chabster.blogspot.com/2008/02/…wearemappingyourdreams.com/andrew/…
【解决方案2】:

您不能序列化具有循环关系的对象图:

class Employee
{
  Employee Manager;
  List<Employee> Employees;


}


var bossMan = new Employee();
var emp2 = new Employee{Manager = bossMan}
var bossMan.Employees.Add(emp2);

如果你现在尝试序列化 bossman 或 emp2,你会得到异常。

查看this post,查看循环对象图以获取解决方案。

【讨论】:

    【解决方案3】:

    马克: 由于某种原因,它不允许我添加评论;

    我添加了这个

    [Table(Name="dbo.Client")]
    [DataContract(IsReference=true)]
    public partial class Client: INotifyPropertyChanging, INotifyPropertyChanged
    {
      ..//
      private EntitySet<ClEmp> _ClEmp;
    
      [Association(N...)]
      [DataMember(Order=70, EmitDefaultValue=false)]
      public EntitySet<ClEmp> ClEmps
    }
    

    我的序列化是这样的:

    DataContractSerializer ser =
                        new DataContractSerializer(typeof(Client));
                    var ms = new System.IO.MemoryStream();
    
                    ser.WriteObject(ms, r);
    
                    ms.Seek(0, System.IO.SeekOrigin.Begin);
    
    
    
                    var sr = new System.IO.StreamReader(ms);
    
                    var xml = sr.ReadToEnd();
    

    当我查看 var xml 时,我没有得到我的实体集 ClEmp。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 2011-09-13
      相关资源
      最近更新 更多