2

MVC 4.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 回答