Hat jemand das tatsächlich funktioniert? Es gibt keine Dokumentation darüber, wie diese Funktion aktiviert werden kann und mir fehlen Attributfehler trotz eines 3.5 SP1-Projekts.WCF Datacontract kostenlose Serialisierung (3.5 SP1)
Antwort
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));
}
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?
Ja, ich versuche, das Attribut freie Serialisierung zu verwenden, die als Teil von SP1 (http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx) angekündigt wurde. Verdammt, wenn ich es zur Arbeit bringen kann und es keine Dokumentation dafür gibt.
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()
};
}
}
Möglicherweise ist meine Verwendung von abstrakten Basisklassen die Sache verwirrend, obwohl ich alles in die Liste der bekannten Typen einfüge.
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.
Hat eigentlich der Client die Daten zurückbekommen? –