IQueryable <> Сериализация - C # -VS2008-WCF - PullRequest
2 голосов
/ 06 мая 2009

Я собрал свой * .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 ко многим, является Клиент - Сотрудник

С помощью 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 <> с отношениями 1 ко многим?

Ответы [ 3 ]

1 голос
/ 14 мая 2009

Нельзя сериализовать граф объектов, который имеет циклические отношения:

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


}


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

Если вы сейчас попытаетесь сериализовать bossman или emp2, вы получите исключение.

Посмотрите на этот пост , проверьте графики циклических объектов для решения.

1 голос
/ 06 мая 2009

Что именно такое сообщение об ошибке? Обратите внимание, что вам нужно сериализовать что-то конкретное, например, список или массив объектов (не запрос).

Если вы хотите запросить по проводам, посмотрите ADO.NET Data Services, которая делает это.

Кроме того - вы установили режим сериализации на «однонаправленный» в конструкторе dbml? Пока петель нет, все должно работать нормально.

0 голосов
/ 07 мая 2009

Марк: По какой-то причине он не позволяет мне добавлять комментарии;

Я добавил это

[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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...