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

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

3 голосов
/ 08 октября 2008

Ситуация такая: главный проект А. и библиотека классов Б. А, ссылки Б

Проект B имеет классы, которые будут сериализованы. Классы используются в A. Теперь проблема возникает, когда из проекта A я пытаюсь сериализовать объекты из B. Выдается исключение, которое говорит, что класс из A не может быть сериализован. Это странная часть, так как в классах в B я не могу ссылаться на классы в A. (будет создана круговая зависимость).

Как я могу отследить проблему? потому что метод исключения не говорит, где появилась проблема?

Редактировать: Хорошо, я нашел проблему с помощью небольшого приложения Кента Бугаарта : D. У меня есть прослушиватель PropertyChanged в классе в проекте A, который не помечен как Serializable - и я не хочу отмечать его так. (это будет сериализовать этот класс справа?)

Я решил проблему с событием, перейдя по этой ссылке: .NET 2.0 решение для сериализации объектов, вызывающих события . Проблема все еще существует, но, вероятно, что-то похожее.

PS: Отличный инструмент от Кент Бугаарт

Ответы [ 4 ]

10 голосов
/ 08 октября 2008

Я написал инструмент под названием sertool , который скажет вам, что в вашем графе объектов нельзя сериализовать и как на него ссылаются.

2 голосов
/ 08 октября 2008

Сначала вам нужно будет изолировать проблему для определенного класса. Затем вы можете реализовать пользовательскую сериализацию и отладить ее, чтобы найти реальную проблему.

Просто простая реализация, которая позволит вам пройти через процесс:

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));
        }
    }
}

Инструмент Кента также выглядит очень красиво и, без сомнения, поможет вам.

1 голос
/ 08 октября 2008

Возможно, ваши объекты из B хранят ссылки на объекты из A, используя классы / интерфейсы, которые не являются частью A или B, например, если B хранит объекты из A, используя ссылку на объект (System.Object)

0 голосов
/ 08 октября 2008

Допустим, TA и TB являются типами, определенными в A и B. Допустим, есть интерфейс I либо в B, либо в сборке и ссылки на B и A. TA реализует I. TB имеет открытое настраиваемое свойство типа I с именем P.

Теперь вы можете сделать это:

TB b = new TB();
b.P = new TA();

Поскольку TA реализует I, это возможно.

Теперь у вашего графа объектов есть экземпляр типа, который может быть не сериализуемым и исходящий из сборки A.

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