#c# #serialization
Вопрос:
Ситуация такова : основной проект A. и библиотека классов B. Ссылки на B
В проекте B есть классы, которые будут сериализованы. Классы используются в A. Теперь проблема возникает, когда из проекта A я пытаюсь сериализовать объекты из B. Возникает исключение, в котором говорится, что класс из A не может быть сериализован. Это странная часть, так как в классах в B я не могу ссылаться на классы в A. (будет создана циклическая зависимость).
Как я могу отследить проблему ? потому что метод исключения не указывает, где возникла проблема ?
Изменить : Хорошо, я нашел проблему с помощью небольшого приложения Кента Бугарта 😀 . У меня есть прослушиватель PropertyChanged в классе проекта A, который не помечен как сериализуемый, и я не хочу его так отмечать. ( это приведет к сериализации этого класса вправо ?)
Я решил проблему с событием, перейдя по этой ссылке : Решение .NET 2.0 для сериализации объектов, вызывающих события. Проблема все еще существует , но, вероятно, это что-то похожее.
PS: Отличный инструмент от Kent Boogaart
Комментарии:
1. Вы что-то делаете с веб-сервисом в проекте А?
2. Пожалуйста, опубликуйте сообщение об исключении.
3. Что именно вы делаете (двоичная сериализация, xml-сериализация, сериализация datacontract,….)? И какое исключение вы получаете?
Ответ №1:
Я написал инструмент под названием sertool, который расскажет вам, что в вашем графе объектов нельзя сериализовать и как на него ссылаются.
Комментарии:
1. Этот инструмент очень полезен, спасибо! Стоит отметить, что когда я зашел в блог, мне пришлось самостоятельно войти в Windows Live, чтобы загрузка была доступна (без входа в систему был просто белый квадрат…).
Ответ №2:
Сначала вам нужно будет изолировать проблему для определенного класса. Затем вы можете реализовать пользовательскую сериализацию и отладить ее, чтобы найти реальную проблему.
Просто простая реализация, которая позволит вам пройти через весь процесс:
using System;
using System.Runtime.Serialization;
using System.Security.Permissions;
[Serializable]
public class Test : ISerializable
{
private Test(SerializationInfo info, StreamingContext context)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(Test));
foreach (SerializationEntry entry in info)
{
PropertyDescriptor property = properties.Find(entry.Name, false);
property.SetValue(this, entry.Value);
}
}
[SecurityPermission(SecurityAction.LinkDemand, SerializationFormatter = true)]
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(Test));
foreach (PropertyDescriptor property in properties)
{
info.AddValue(property.Name, property.GetValue(this));
}
}
}
Инструмент Кента также выглядит очень красиво и, без сомнения, поможет вам.
Ответ №3:
Возможно, ваши объекты из B хранят ссылки на объекты из A, используя классы/интерфейсы, которые не являются частью A или B, например, если B хранит объекты из A, используя объект (Система.Объект) ссылка
Ответ №4:
Допустим, TA и TB-типы, определенные в A и B. Допустим, есть интерфейс I либо в B, либо сборка, как B, так и ссылка. TA реализует I. TB имеет общедоступное настраиваемое свойство типа I с именем P.
Теперь вы можете сделать это:
TB b = new TB();
b.P = new TA();
Поскольку TA реализует I, это возможно.
Теперь в вашем графе объектов есть экземпляр типа, который может быть не сериализуемым и получен из сборки A.