【问题标题】:Serialization doesn't accept different namespaces. Why?序列化不接受不同的命名空间。为什么?
【发布时间】:2011-08-31 02:30:30
【问题描述】:

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

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

原始错误:

错误 1 ​​Resx 文件无效。无法加载 .RESX 文件中使用的类型 Namespace2.FileFiltering、WindowsFormsApplication1、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null。确保已将必要的引用添加到您的项目中。第 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);
        }
    }
}

有人知道解决方法还是我只是卡住了?我已经为此工作了几个小时,终于在一段时间后让它序列化,属性工作和一切,至少其中一些错误是我刚刚了解到它与项目命名空间不同的命名空间并不好。

【问题讨论】:

  • 请为您的问题使用适当的标题。 “我束手无策”根本无法描述您的问题。
  • 谢谢,我正在想一个标题并编辑这篇文章。这个标题不错。
  • 您遇到的实际错误是什么?您如何准确地序列化这些对象?
  • 我使代码复制/粘贴变得友好,您只需要一个空的 cs 文件来编译它。我得到的错误:Resx 文件无效。无法加载类型 Namespace2.FileFiltering 我序列化它们的方式:它们在另一个命名空间中。在这种情况下: Namespace2.FileFilter 是我正在调用的对象,我知道它存在但编译器要求不同。

标签: c# serialization namespaces resx


【解决方案1】:

问题与命名空间本身无关。只是框架在尝试反序列化控件时无法找到该类。

这可以通过在框架尝试反序列化该属性时指定一个自定义序列化程序来解决 - 这可以通过DesignerSerializerAttribute 来完成。

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

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

【讨论】:

  • 我打算经常使用它.. 我的意思是很多.. 我通常会浪费时间写东西,就像其他人会使用它们一样,即使我想把它们留给自己。我想我最终会让所有东西都开源,我可能会从中学习。无论如何,我按照您所说的进行,一切都正确编译:[System.ComponentModel.Design.Serialization.DesignerSerializerAttribute(typeof(FileFiltering), typeof(System.Runtime.Serialization.Formatters.Binary.BinaryFormatter))] 在我的对象的顶部。非常感谢您的帮助:D。
猜你喜欢
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多