IQueryable的<>序列化 - C#-VS2008-WCF

时间:2009-05-06 18:37:57

标签: c# wcf

我使用所需的表构建了我的* .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
 }

客户端具有1对多关系的表之一是Client - Employee

使用'localClient',我想序列化并返回调用者。但它告诉我无法形成XML文档。

这是InnerException: 序列化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的序列化&lt;&gt;与1对多关系不可能?

3 个答案:

答案 0 :(得分:1)

错误消息究竟是什么?请注意,您必须序列化具体的内容,如列表或对象数组(而不是查询)。

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

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

答案 1 :(得分:1)

您无法序列化具有周期性关系的对象图:

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,查看循环对象图以找到解决方案。

答案 2 :(得分:0)

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

我添加了这个

[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时,我没有得到我的enity set ClEmp。