代码之家  ›  专栏  ›  技术社区  ›  user7375

WCF DataContract免费序列化(3.5 SP1)

  •  3
  • user7375  · 技术社区  · 18 年前

    有人真的要用这个吗?关于如何启用此功能的文档不存在,尽管有一个3.5sp1项目,但我还是得到了缺少的属性异常。

    6 回复  |  直到 8 年前
        1
  •  1
  •   Jacob Stanley    17 年前

    我发现它不适用于内部/私有类型,但使我的类型公开,它可以很好地工作。这意味着也没有匿名类型:(

    使用Reflector,我找到了方法ClassDataContract.IsOnAttributedTypevalidForSerialization(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
  •  1
  •   Doanair    18 年前

    我让它在测试应用程序上运行很好…

    服务定义:

    [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
  •  0
  •   Doanair    18 年前

    WCF中有几个序列化选项:数据协定、XML序列化和原始数据负载。你想用哪一个?从这个问题来看,您似乎试图使用的对象不是用datacontact属性修饰的对象。这就是你要问的吗?

        4
  •  0
  •   user7375    18 年前

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

        5
  •  0
  •   user7375    18 年前

    可能我对抽象基类的使用混淆了这一点,尽管我正在将所有内容添加到已知类型列表中。

        6
  •  0
  •   Doanair    18 年前

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

    推荐文章