Проблема сериализации

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