3

これを実際に機能させた人はいますか?この機能を有効にする方法に関するドキュメントは存在せず、3.5 SP1 プロジェクトがあるにもかかわらず、属性の例外が見つかりません。

4

6 に答える 6

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

}
于 2008-09-15T15:11:50.273 に答える
1

internal/private 型では機能しないことがわかりましたが、型を public にするとうまくいきました。これは、匿名型もないことを意味します:(

リフレクターを使用して、決定を下すと思われるメソッド ClassDataContract.IsNonAttributedTypeValidForSerialization(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));

}

于 2009-01-23T08:07:12.893 に答える
0

はい、SP1( http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx )の一部として発表された属性のないシリアル化を使用しようとしています。私がそれを動作させることができて、それについてのドキュメントがないなら、くそったれ。

于 2008-09-15T14:52:12.397 に答える
0

はい、抽象クラスと継承に関係している可能性があります。シリアル化を台無しにすることがあります。また、すべてが公開されていない場合は、クラスとクラス階層の可視性になる可能性もあります。

于 2008-09-16T16:31:43.227 に答える
0

WCF には、データ コントラクト、XML シリアル化、生データ ペイロードなど、いくつかのシリアル化オプションがあります。これらのうちどれを使用しようとしていますか? 質問から、datacontact 属性で装飾されたオブジェクト以外のものを使用しようとしているようです。それはあなたが求めているものですか?

于 2008-09-15T14:46:38.417 に答える
0

既知の型リストにすべてを追加していますが、抽象基本クラスの使用が問題を混乱させている可能性があります。

于 2008-09-15T15:16:05.287 に答える