Найти элементы, которые не [Сериализуемы]

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

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

Сайт представляет собой сайт ASP.NET 1.1, созданный с использованием VS 2003

13.12.2008 14:52:32
2 ОТВЕТА
РЕШЕНИЕ

Перечисления по своей природе сериализуемы.

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

var assemblies = GetTheAssembliesFromYourApp();
foreach (var assembly in assemblies)
{
    var types = assembly.GetTypes ();
    foreach (var type in types)
    {
        if (AttributeHelper.GetAttrbiute<Serializable> (type) == null)
        {
            // Log somewhere - this type isn't serialisable...
        }
    }
}


static class AttributeHelper
{
    #region Static public methods

    #region GetAttribute

    static public T GetAttribute<T> (object obj)
        where T : Attribute
    {
        if (obj == null)
            throw new ArgumentNullException ("obj");

                    // If the object is a member info then we can use it, otherwise it's an instance of 'something' so get it's type...
        var member = (obj is System.Reflection.MemberInfo) ? (System.Reflection.MemberInfo)obj : obj.GetType ();

        return GetAttributeImpl<T> (member);
    }

    #endregion GetAttribute

    #endregion Static public methods

    #region Static methods

    #region GetAttributeImpl

    static T GetAttributeImpl<T> (System.Reflection.MemberInfo member)
        where T : Attribute
    {
        var attribs = member.GetCustomAttributes (typeof (T), false);
        if (attribs == null || attribs.Length == 0)
            return null;

        return attribs[0] as T;
    }

    #endregion GetAttributeImpl

    #endregion Static methods
}
2
13.12.2008 15:19:07
Только что увидев ваш комментарий о том, что сайт является приложением 1.1, приведенный выше код использует дженерики, но удалить дженерики из него не составит труда.
Kieron 13.12.2008 15:13:19
Я был в состоянии написать консольное приложение 2.0 и загрузить 1.1 dll спасибо. это сработало. Вы можете обновить свой код, если вы пропустили foreach (введите типы) вверху.
bendewey 13.12.2008 15:33:53
Разве плохо помечать все объекты как сериализуемые на случай, если они будут сохранены в сеансе?
bendewey 13.12.2008 15:34:46

Enum должен быть сериализуемым.

Чтобы выяснить, что не сериализуемо, у меня есть модульный тест для этого объекта, который просто вызывает метод, чтобы узнать, сериализуем ли он. Этот метод пытается сериализовать, если не удается, объект не ...

    public static Stream serialize<T>(T objectToSerialize)
    {
        MemoryStream mem = new MemoryStream();
        BinaryFormatter b = new BinaryFormatter();
        b.Serialize(mem, objectToSerialize);
        return mem;
    }

В вашем unittest вам нужно вызвать serialize (objectToCheck); если не serizlisable, исключение повысит.

2
13.12.2008 15:05:06
Две вещи, одна, есть ли способ сделать это, когда он ищет все решение? Во-вторых, мое решение - сайт ASP.NET 1.1, использующий версию 2003. Я никогда не создавал тесты в этой старой среде, могу ли я?
bendewey 13.12.2008 15:11:39
Целое решение не должно быть сериализовано. Вы должны быть в состоянии выбрать, какой класс должен или нет. И VS2003 позволяет тестировать ... модульное тестирование не в VS (как Nunit)
Patrick Desjardins 13.12.2008 15:21:21