【问题标题】:WCF Datacontract free serialization (3.5 SP1)WCF Datacontract 免费序列化 (3.5 SP1)
【发布时间】:2010-09-08 22:45:27
【问题描述】:

有人让这个真正起作用吗?不存在有关如何启用此功能的文档,尽管有 3.5 SP1 项目,但我仍然缺少属性异常。

【问题讨论】:

    标签: .net wcf serialization


    【解决方案1】:

    我发现它不适用于内部/私有类型,但是将我的类型设为公共它可以正常工作。这意味着也没有匿名类型:(

    使用反射器,我发现似乎可以做出决定的方法 ClassDataContract.IsNonAttributedTypeValidForSerialization(Type)。最后一行似乎是杀手,类型必须是可见的,所以不允许内部/私有类型:(

    internal static bool IsNonAttributedTypeValidForSerialization(Type type)
    {
        if (type.IsArray)
        {
             return false;
        }
        if (type.IsEnum)
        {
            return false;
        }
        if (type.IsGenericParameter)
        {
            return false;
        }
        if (Globals.TypeOfIXmlSerializable.IsAssignableFrom(type))
        {
            return false;
        }
        if (type.IsPointer)
        {
            return false;
        }
        if (type.IsDefined(Globals.TypeOfCollectionDataContractAttribute, false))
        {
            return false;
        }
        foreach (Type type2 in type.GetInterfaces())
        {
            if (CollectionDataContract.IsCollectionInterface(type2))
            {
                return false;
            }
        }
        if (type.IsSerializable)
        {
            return false;
        }
        if (Globals.TypeOfISerializable.IsAssignableFrom(type))
        {
            return false;
        }
        if (type.IsDefined(Globals.TypeOfDataContractAttribute, false))
        {
            return false;
        }
        if (type == Globals.TypeOfExtensionDataObject)
        {
            return false;
        }
        if (type.IsValueType)
        {
            return type.IsVisible;
        }
        return (type.IsVisible && (type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, Globals.EmptyTypeArray, null) != null));
    

    }

    【讨论】:

      【解决方案2】:

      我让它在一个测试应用程序上运行得很好......

      服务定义:

      [ServiceContract]
      public interface IService1
      {
      
          [OperationContract]
          CompositeType GetData(int value);
      
      }
      
      
      public class CompositeType
      {
          bool boolValue = true;
          string stringValue = "Hello ";
      
          public bool BoolValue
          {
              get { return boolValue; }
              set { boolValue = value; }
          }
      
          public string StringValue
          {
              get { return stringValue; }
              set { stringValue = value; }
          }
      }
      

      服务实现:

      public class Service1 : IService1
      {
          public CompositeType GetData(int value)
          {
              return new CompositeType()
              {
                  BoolValue = true,
                  StringValue = value.ToString()
              };
          }
      
      }
      

      【讨论】:

      • 客户端真的把数据拿回来了吗?
      【解决方案3】:

      WCF 中有几个序列化选项:数据协定、XML 序列化和原始数据有效负载。您想使用其中哪些?从问题来看,您似乎正在尝试使用除用 datacontact 属性装饰的对象以外的其他东西。你问的是这个吗?

      【讨论】:

        【解决方案4】:

        是的,我正在尝试使用作为 SP1 的一部分宣布的无属性序列化 (http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx)。该死的,如果我能让它工作并且没有它的文档。

        【讨论】:

          【解决方案5】:

          可能我对抽象基类的使用使事情变得混乱,尽管我将所有内容都添加到已知类型列表中。

          【讨论】:

            【解决方案6】:

            是的,它可能与抽象类和继承有关。它有时会与序列化混淆。此外,如果所有内容都不公开,它也可能是类和类层次结构的可见性。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-06-28
              • 2012-06-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多