There was an error while trying to serialize parameter http://tempuri.org/:obj. The InnerException message was ‘Type ‘System.Collections.Generic.List`1[Employee, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]’ with data contract name ‘ArrayOfEmployee:http://schemas.datacontract.org/2004/07/Interfaces’ is not expected. Add any types not known statically to the list of known types – for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

Hi if you are getting your hands dirty with WCF and got your mind blown up with the error as shown above or shown in Screen i have medicine of it..so go ahead!!!!

image

I am creating one simple serviceoperation which should take argument as an object but i will pass instance of my generic list which can be like List<Employee> or List<Person> and all this….because in service implementation i will do further operation based on type….I have created one application like this:

IService.cs

image

Service.CS

image

Employee.CS

image

Client.CS

image

Now when i run this application it gives me error of KnownTypeAttribute and serialization

Cause:

Actually root cause of problem is that we have defined object as our datacontract but when we pass List<Employee> or List<Person> it dosen’t knows what to serialize and send from wire…..hoohh…….simple if i have told you to say HI and it i will sat Bye…you can’t understand what i mean to say…so i need to help you in understanding Bye…Simple!!!!!so let us tell CLR that hey what to do if i pass List<Employee> or any type which i want to pass..

Solution:

Open your service contract IService.cs

and after [ServiceContract] Add [ServiceKnownType(typeof(List<Employee>))] or [ServiceKnownType(typeof(List<Person>))]….and Run the application…modified IService.cs looks like this:

image

Hope it helped you…Wants to say..Thanks say it to

Sowmy Srinivasan’s for nice and in-depth article:http://blogs.msdn.com/sowmy/

Question:

I am just wondering suppose if i have 50 Types which i want to pass then i need to declare all this on top of IService….just searching some alternative for it..if i found will let you know and hoping for the same….

6 Comments

  • hi, for me this code don’t work

    ERROR:

    System.Runtime.Serialization.SerializationException: Type ‘System.Collections.Generic.List`1[[ClientWS.wcfServerService.Employee, ClientWS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]’ with data contract name ‘ArrayOfEmployee:http://schemas.datacontract.org/2004/07/wcfServer‘ is not expected. Add any types not known statically to the list of known types – for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.
    at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle)
    at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiTypeAtTopLevel(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle originalDeclaredTypeHandle)
    at System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph)
    at System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph)
    at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph)
    at System.Runtime.Serialization.XmlObjectSerializer.WriteObject(XmlDictionaryWriter writer, Object graph)
    at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameterPart(XmlDictionaryWriter writer, PartInfo part, Object graph)

    My code:

    Server side – WCF

    IService1.cs

    namespace wcfServer
    {
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config.
    [ServiceContract]
    [ServiceKnownType(typeof(List))]
    public interface IService1
    {
    [OperationContract]
    string ParseObject(object obj);
    }
    }

    Service1.svc.cs

    namespace wcfServer
    {
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file.
    public class Service1 : IService1
    {
    #region Implementation of IService1

    public string ParseObject(object obj)
    {
    List emp = (List) obj;
    string empDetalils = string.Format("EmployeeID {0} And Employee Name {1} And GetType is {2}",
    emp[0].EmployeeID, emp[0].EmployeeName, obj.GetType());
    return empDetalils;
    }

    #endregion
    }
    }

    Employee.cs

    namespace wcfServer
    {
    [DataContract]
    public class Employee
    {
    [DataMember]
    public int EmployeeID { get; set; }
    [DataMember]
    public string EmployeeName { get; set; }
    }
    }

    Client side:

    toWcfServer.cs

    namespace ClientWS
    {
    public class toWcfServer : IService1
    {
    #region Implementation of IService1

    public string ParseObject(object obj)
    {
    try
    {
    wcfServerService.Service1Client client = new Service1Client();
    string strEmployee = client.ParseObject(obj);
    client.Close();

    return strEmployee;
    }
    catch (Exception ex)
    {
    return ex.InnerException.ToString();
    }
    }

    #endregion
    }
    }

    Form1.cs

    private void button1_Click(object sender, EventArgs e)
    {
    toWcfServer toServer = new toWcfServer();
    List listEmployees = new List();
    listEmployees.Add(new Employee(){EmployeeID = 10, EmployeeName = "PEPEK"});
    textBox1.Text = toServer.ParseObject(listEmployees);
    }

    what is wrong in the code?

    • Hi,

      Thanks for going through my article.

      In your code you just need to change following lines:

      IService1.cs

      namespace wcfServer
      {
      // NOTE: If you change the interface name “IService1” here, you must also update the reference to “IService1” in Web.config.
      [ServiceContract]
      [ServiceKnownType(typeof(Employee))] //Earlier it was List
      public interface IService1
      {
      [OperationContract]
      string ParseObject(object obj);
      }
      }

      Because your ServiceMessage contains Employee object which .NET f/w don’t knows….so you just need to introduce your Employee object to .NET f/w and [ServiceKnownType(typeof(Employee))] does the same.

      Feel free to get back to me if still it doesn’t work.

      Happy Coding,
      Kiran

  • Thanks kiran , Great article it worked for me.

  • Hey I am so thrilled I found your website, I really found you by accident,
    while I was searching on Aol for something else,
    Anyways I am here now and would just like to say thanks a lot for a fantastic post and a
    all round thrilling blog (I also love the theme/design), I don’t have time to read
    it all at the minute but I have saved it and also included your RSS feeds, so when I have time I
    will be back to read much more, Please do keep
    up the awesome job.

Comments are closed.