2008-09-15 94 views

回答

1

我发现它不适用于内部/私人类型,但使我的类型公开它工作正常。这意味着没有匿名类型:(

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

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)); 

}

0

WCF中有几个序列化选项:数据契约,XML序列化和原始数据有效载荷。你试图使用哪些?从这个问题看来,您似乎在尝试使用除datacontact属性装饰的对象之外的其他东西。你在问什么?

1

我这对一个测试应用程序就好了工作...

服务定义:

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

} 
+0

难道客户实际获得的数据? – 2009-03-03 03:03:58

0

可能是我用抽象基类的是令人困惑的是,尽管我将所有内容添加到已知类型列表中。

0

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