Объекты Linq To Sql и проблема сериализации
Я пытаюсь сериализовать граф объектов. Это работает до тех пор, пока мне не нужно загрузить дочернюю сущность, которая является набором сущностей. Система не позволит ей сериализоваться... она выдает мне эту ошибку:
Тип 'System.Data.Linq.EntitySet`1[NetDataContractSerializerTest.JobService]' не может быть сериализован. Попробуйте пометить его атрибутом DataContractAttribute и пометить все его элементы, которые вы хотите сериализовать, атрибутом DataMemberAttribute. Если тип является коллекцией, попробуйте пометить его с помощью CollectionDataContractAttribute. См. Документацию Microsoft .NET Framework для других поддерживаемых типов.
Вот код, который я использую:
DataClasses1DataContext dataAccessContext = new DataClasses1DataContext();
MemoryStream stream = new MemoryStream();
DataLoadOptions dataloadOptions = new DataLoadOptions();
dataloadOptions.LoadWith<JN>(j => j.nh);
dataloadOptions.LoadWith<JN>(j => j.JobServices);// this is the child entity set
dataAccessContext.LoadOptions = dataloadOptions;
var jn= dataAccessContext.JN.Where(j => j.LocnID.Trim() == "HT").ToList();
var netDataContractSerializer = new NetDataContractSerializer();
netDataContractSerializer.Serialize(stream, jn); //the error happens here
Если я удалю
dataloadOptions.LoadWith(j => j.JobServices)
данные будут сериализованы с неповрежденными таблицами JN и nh. Но когда я ставлю
dataloadOptions.LoadWith(j => j.JobServices)
обратно я получаю ошибку.
Я лично думаю, что он хочет, чтобы я добавил ToList() в JobServices, к сожалению, я не могу сделать
dataloadOptions.LoadWith(j => j.JobServices.ToList())
Это выдает ошибку.
Есть идеи?
2 ответа
Ну да ладно.... посмотри, что я нашел..... Это, казалось, отлично сериализовало и десериализовало мои вещи. Вместо того чтобы использовать NetDataContractSerializer.Serialize(), этот парень написал функции сериализации и десериализации, которые использовали DataContractSerializer, XMLWriter и XMLReader.
Проверьте ссылку ниже
http://www.codeproject.com/Tips/47054/How-to-serialize-list-of-linq-entities-ex-from-DBM
Сообщение об ошибке очень информативно: класс JobService не помечен для сериализации как контракт данных.
Вам нужно будет украсить его DataContractAttribute
атрибут, и украсить членов DataMember
приписывать.
[DataContract]
public class JobService
{
[DataMember]
public string SomeProperty { get; set;}
}