2008-09-15 12 views

Antwort

1

Ich fand, dass es nicht mit internen/privaten Typen funktioniert, aber meinen Typ öffentlich machen, hat es gut funktioniert. Dies bedeutet keine anonymen Typen entweder :(

Mit reflector habe ich die Methode ClassDataContract.IsNonAttributedTypeValidForSerialization (Type) gefunden, die die Entscheidung zu treffen scheint interne/private Typen erlaubt :(

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

Es gibt mehrere Serialisierungsoptionen in WCF: Datenkontrakt, XML-Serialisierung und Rohdatennutzlast. Welche von diesen versuchen Sie zu verwenden? Aus der Frage scheint es, dass Sie versuchen, etwas anderes als Objekte zu verwenden, die mit Datenkontaktattributen versehen sind. Ist das, was du fragst?

1

Ich habe dies auf einem Test-App

Service Definition ganz gut zu funktionieren ...:

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

Service Implementation:

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

} 
+0

Hat eigentlich der Client die Daten zurückbekommen? –

0

Möglicherweise ist meine Verwendung von abstrakten Basisklassen die Sache verwirrend, obwohl ich alles in die Liste der bekannten Typen einfüge.

0

Ja, es könnte mit abstrakten Klassen und Vererbung zu tun haben. Es kann manchmal Serialisierung durcheinander bringen. Es könnte auch Sichtbarkeit der Klassen und der Klassenhierarchie sein, wenn alles nicht öffentlich ist.