0

WCFサービスを介して送信したいオブジェクトがあります。これは、シリアル化できる必要があり、タイプがわからない可能性のあるオブジェクトです。これはプリミティブ型で機能することがわかりますが、参照型では値を正常にシリアル化できません。以下のテストでは、リストオブジェクトまたはタプルオブジェクトのいずれかをシリアル化しようとすると、デバッグ中にエラーメッセージが表示されます。タイプを知らなくてもこのプロセスを実行する良い方法はありますか?

[DataContract]
public class SizingObject
{
    [DataMember]
    public List<SizingItem> SizingItems { get; set; }
}

[DataContract]
public class SizingItem
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Value { get; set; }

    [DataMember]
    public string Unit { get; set; }

    [DataMember]
    public string ListItemId { get; set; }

    [DataMember]
    public object Item { get; set; }
}

        var i = new SizingObject();
        i.SizingItems = new List<SizingItem>();
        i.SizingItems.Add(new SizingItem
                              {
                                  Item = "String",
                                  ListItemId = string.Empty,
                                  Name = "string item",
                                  Unit = string.Empty,
                                  Value = string.Empty
                              });

        i.SizingItems.Add(new SizingItem
                              {
                                  Item = 0.23,
                                  ListItemId = string.Empty,
                                  Name = "double item",
                                  Unit = string.Empty,
                                  Value = string.Empty
                              });

        i.SizingItems.Add(new SizingItem
                              {
                                  Item = new List<double> { 3, 4, 5, 6 },
                                  ListItemId = string.Empty,
                                  Name = "list<double> item",
                                  Unit = string.Empty,
                                  Value = string.Empty
                              });

        i.SizingItems.Add(new SizingItem
                              {
                                  Item = new Tuple<string, double>("TupleItem", 2.00),
                                  ListItemId = string.Empty,
                                  Name = "Tuple<string, double> item",
                                  Unit = string.Empty,
                                  Value = string.Empty
                              });

        // Serialize User Data
        var stringWriter = new StringWriter();
        var serializer1 = new XmlSerializer(typeof(SizingObject));
        serializer1.Serialize(stringWriter, i);
        var xml = stringWriter.ToString();

        var serializer2 = new XmlSerializer(typeof(SizingObject));
        i = (SizingObject)serializer2.Deserialize(new StringReader(xml));

        var dict = new Dictionary<Type, Func<object, object>>();
        dict.Add(typeof(string), e => e as string);
        dict.Add(typeof(double), e => e);
        dict.Add(typeof(List<double>), e => e as List<double>);
        dict.Add(typeof(Tuple<string, double>), e => e as Tuple<string, double>);

        foreach (var item in i.SizingItems)
        {
            var result = dict[item.Item.GetType()].Invoke(item.Item);
        }

4

2 に答える 2

0

単にそれを?として送ることを考えたことがありObjectますか?

クラス「テンプレート」のコピーが両端にあると仮定すると、それをオブジェクトとして送信し、受信側で型にキャストできます。

もう1つのアイデアは、実際に意味のある情報がないと仮定してXMLとして送信し、受信側でクラスを再構築することです。

于 2012-11-21T16:09:23.493 に答える
0

この問題をもう少し時間をかけて、既知のタイプのセットを提供することで、この問題を解決できることがわかりました。タプル型をシリアル化できなかったため、代替を作成する必要がありましたが、その型を考えると予想どおりでしたが、リストやその他のオブジェクトは完全にシリアル化できるようになりました。

var types = new Type[] { typeof(string), typeof(double), typeof(List), typeof(WCFTuple) };

            // Serialize User Data
            var stringWriter = new StringWriter();
            var serializer1 = new XmlSerializer(typeof(SizingObject), types);
            serializer1.Serialize(stringWriter, i);
            var xml = stringWriter.ToString();

            // Deserialize object.
            var serializer2 = new XmlSerializer(typeof(SizingObject), types);
            i = (SizingObject)serializer2.Deserialize(new StringReader(xml));

于 2013-02-01T12:33:43.077 に答える