序列化不接受不同的命名空间。为什么?

时间:2011-08-31 02:30:31

标签: c# serialization namespaces resx

我终于找到了问题,但这没有任何意义,这似乎是不可能的。这甚至可以修复吗?我认为命名空间都是一样的,你可以通过输入thenamespace.theclass等来调用和访问来自不同命名空间的控件,这主要用于分类(对我来说无论如何)。

我的问题是序列化似乎不接受新的命名空间,它生成的ResX代码会被窃听,除非引用与项目命名空间位于同一名称空间中。

原始错误:

  

错误1无效的Resx文件。无法加载类型Namespace2.FileFiltering,WindowsFormsApplication1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null,用于.RESX文件。确保已将必要的引用添加到项目中。第127行,第5行.c:\ users \ aderic \ documents \ visual studio 2010 \ Projects \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Form1.resx 127 5 WindowsFormsApplication1

我想要一个可重用的控件,但我不想用它制作一个DLL。 (我可以对它进行模糊处理,但我宁愿不让人们导入它并使用它)。我有2个类,他们会正常编译,但因为我选择了不同的命名空间,唯一的编译错误处理ResX没有找到对象。以下是两个班级:

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

有没有人知道这方面的解决方法还是我被卡住了?我已经花了好几个小时,最后经过一段时间的序列化,属性工作和一切,至少有一些错误是我只是学习它不能很好地使用与项目命名空间不同的命名空间。 / p>

1 个答案:

答案 0 :(得分:1)

问题与命名空间本身无关。简单地说,框架在尝试反序列化控件时无法找到类。

这可以通过指定框架尝试反序列化该属性时使用的自定义序列化程序来克服 - 可以使用DesignerSerializerAttribute来完成。

Designer序列化的文档: http://msdn.microsoft.com/en-us/library/ms171834.aspx

老实说,除非你有特殊需要,否则我会完全避免使用设计器序列化(特别是因为你提到你对其他开发人员重用你的控件不感兴趣)。