.net WCF Datacontract自由序列化(3.5 SP1)

.net WCF Datacontract自由序列化(3.5 SP1),.net,wcf,serialization,.net,Wcf,Serialization,有人真的能用吗?关于如何启用此功能的文档不存在,尽管有一个3.5 SP1项目,但我还是遇到了缺少的属性异常 WCF中有几个序列化选项:数据协定、XML序列化和原始数据有效负载。你想用哪一个?从这个问题来看,您似乎在尝试使用除用datacontact属性修饰的对象之外的其他对象。这就是您要问的吗?是的,我正在尝试使用作为SP1()的一部分宣布的无属性序列化。该死的,如果我能让它工作,而且没有相关文档。我在一个测试应用程序上得到了这个,很好 服务定义: [ServiceContract] publi

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

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

是的,我正在尝试使用作为SP1()的一部分宣布的无属性序列化。该死的,如果我能让它工作,而且没有相关文档。

我在一个测试应用程序上得到了这个,很好

服务定义:

[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()
        };
    }

}

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

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

我发现它不适用于内部/私有类型,但将我的类型设置为公共类型效果很好。这意味着也没有匿名类型:(

使用reflector,我找到了方法ClassDataContract.IsNoAttributedTypeValidForSerialization(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));