2

MVC4.0

サービスで以下を実行しています。

[OperationContract(Name = "GetHierarchyReportContents")]
[FaultContract(typeof(InvalidHierarchyNameException))]
[ServiceKnownType(typeof(Node))]
MemoryStream GetContents();

この関数は、ノード (エイリアスのため APINode) のリストを含むメモリ ストリームを提供します。基本的に、それが行うことはすべて次のとおりです。

BinaryFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();

formatter.Serialize(stream, data.ToList<APINode>());

stream.Seek(0, SeekOrigin.Begin);

return stream;

以下は、別のノードとの競合を防ぐために名前空間で定義される Node の定義です。

[DataContract (Name="Node",Namespace="API")]
[Serializable]
public class Node
{
    public Node()
    {
    }

    [DataMember]
    public string Name { get; private set; }

}

クライアント アプリでは、次のことを行います。

BinaryFormatter bf = new BinaryFormatter();
List<Node> nodes = (List<Node>) bf.Deserialize(client.GetContents());

次のようなエラーが表示されます。

アセンブリ 'API、バージョン = 1.0.0.0、カルチャ = ニュートラル、PublicKeyToken = null' が見つかりません。

wsHttpBindingクライアント接続に を使用しています。名前空間が何かを台無しにしている可能性があります。何か案は?

4

1 に答える 1

2

クライアント上の.NETランタイムのバージョンがサーバー上のバージョンと異なる場合、バイナリシリアル化は失敗する可能性があります。DataContractSerializerを使用してバイナリとして使用および書き込みすることをお勧めしXmlDictionaryWriterます:

        var stream = new MemoryStream();
        var writer = XmlDictionaryWriter.CreateBinaryWriter(stream);
        var serializer = new DataContractSerializer(List<APINode>);

        serializer.WriteObject(writer, data.ToList<APINode>());
        writer.Flush();
        stream.Position = 0;
        return stream;

クライアント側:

        using (var reader = XmlDictionaryReader.CreateBinaryReader(client.GetContents(), XmlDictionaryReaderQuotas.Max))
        {
            var serializer = new DataContractSerializer(List<Node>);

            return (List<Node>)serializer.ReadObject(reader, true);
        }
于 2012-09-21T19:16:27.160 に答える