Сериализация не принимает разные пространства имен. Зачем? - PullRequest
0 голосов
/ 31 августа 2011

Я наконец-то нашел проблему, но это не имеет смысла, просто кажется невозможным.Это даже поправимо?Я думал, что все пространства имен работают одинаково, вы можете вызывать и получать доступ к элементам управления из разных пространств имен, набирая thenamespace.theclass и т. Д., Это в основном использовалось для категоризации (для меня в любом случае).

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

Исходная ошибка:

Ошибка 1 Неправильный файл Resx.Не удалось загрузить тип Namespace2.FileFiltering, WindowsFormsApplication1, версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null, который используется в файле .RESX.Убедитесь, что необходимые ссылки были добавлены в ваш проект.Строка 127, позиция 5. c: \ users \ aderic \ documents \ visual studio 2010 \ Projects \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Form1.resx 127 5 WindowsFormsApplication1

Я хотел бы использовать элемент управления многократного использования, но не могуЯ не хочу делать из этого DLL.(Я могу запутать это, но я бы предпочел, чтобы люди не импортировали и не использовали его).У меня есть 2 класса, они обычно компилируются, но поскольку я выбрал другое пространство имен, единственная ошибка компиляции связана с ResX, не находящим объект.Вот 2 класса:

using System;
using System.Windows.Forms;
using System.Runtime.Serialization;

namespace Namespace2
{
    class TestObject : Control
    {
        System.Collections.Generic.List<Namespace2.FileFiltering> InternalExtensions = new System.Collections.Generic.List<Namespace2.FileFiltering>();

        [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Content)]
        public System.Collections.Generic.List<Namespace2.FileFiltering> ExtensionList
        {
            get
            {
                return InternalExtensions;
            }
            set
            {
                InternalExtensions = value;
            }
        }

        public TestObject()
        {
            BackColor = System.Drawing.Color.Gray;       
        }
    }

    [Serializable]
    public class FileFiltering : ISerializable
    {
        String InternalFileType = "New File Type";
        String[] InternalExtensions = new String[] { "*.*" };

        public String FileType
        {
            get
            {
                return InternalFileType;
            }
            set
            {
                InternalFileType = value;
            }
        }
        public String[] Extensions
        {
            get
            {
                return InternalExtensions;
            }
            set
            {
                InternalExtensions = value;
            }
        }

        public FileFiltering()
        {

        }

        public FileFiltering(SerializationInfo info, StreamingContext context)
        {
            FileType = info.GetString("FileType");
            Extensions = (String[])info.GetValue("FileExtensions", typeof(String[]));


            //Debugging.
            Console.WriteLine("FileType is " + FileType);
            Console.WriteLine("First extension is " + Extensions[0]);
        }


        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("FileType", FileType);
            info.AddValue("FileExtensions", Extensions);
        }
    }
}

Кто-нибудь знает обходной путь для этого, или я просто застрял?Я работал над этим часами, наконец-то, через некоторое время он получил сериализацию, свойства работали и все такое, по крайней мере, некоторые из этих ошибок были мной, я просто узнал, что это не очень хорошо работает с пространством имен, отличным от пространства имен проекта.

1 Ответ

1 голос
/ 31 августа 2011

Проблема не имеет ничего общего с пространствами имен как таковыми. Просто фреймворк не может найти класс, когда пытается десериализовать Control.

Эту проблему можно решить, указав собственный сериализатор, который будет использоваться, когда платформа пытается десериализовать это свойство - что можно сделать с помощью DesignerSerializerAttribute.

Документация для Дизайнерской Сериализации: http://msdn.microsoft.com/en-us/library/ms171834.aspx

Честно говоря, я бы вообще не стал использовать сериализацию для дизайнеров, если у вас нет особой необходимости в этом (особенно если учесть, что вы не заинтересованы в том, чтобы другие разработчики повторно использовали ваш контроль).

...