Search code examples
c#arrayscompilationdesigner

No default constructor found, and not serializable


I have tried so many times to get this to compile, what I'd like to do is have an array of names and extensions to be editable via designer, but when editing via designer, it throws the error :

Constructor on type 'Filter' not found.

and on compile:

Code generation for property 'ExtensionList' failed. Error was: 'Type 'Filter' in Assembly 'Testing, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.'

Can anyone help? This is the code I'm using:

    System.Collections.Generic.List<Filter> InternalExtensions = new System.Collections.Generic.List<Filter>();

    [System.ComponentModel.Description(@"Sets a list of acceptable extensions to view.")]
    public System.Collections.Generic.List<Filter> ExtensionList
    {
        get
        {
            return InternalExtensions;
        }
        set
        {
            InternalExtensions = value;
        }
    }

[Serializable()]
public class Filter : System.Runtime.Serialization.ISerializable
{
    String Name;
    String[] Extensions;

    public Filter()
    {

    }       

    public Filter(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
    {
        info.AddValue("FilterName", Name);
        info.AddValue("FilterExtensions", Extensions);
    }


   public void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
   {
       Name = (String)info.GetValue("FilterName", typeof(String));
       Extensions = (String[])info.GetValue("FilterExtensions", typeof(String[]));
   }
}

Solution

  • I'm not sure whether it's all of your problem, but your implementation of ISerializable is the wrong way round. You're meant to populate the object in the constructor, and the SerializationInfo in GetObjectData:

    public Filter(SerializationInfo info, StreamingContext context)
    {
       Name = (String)info.GetValue("FilterName", typeof(String));
       Extensions = (String[])info.GetValue("FilterExtensions", typeof(String[]));
    }
    
    
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("FilterName", Name);
        info.AddValue("FilterExtensions", Extensions);
    }
    

    I wouldn't have expected this to cause a problem at compile-time though... what kind of code generation is involved?