【问题标题】:How do I deserialize an a list of objects from a Memory Stream through WCF如何通过 WCF 反序列化内存流中的对象列表
【发布时间】:2012-09-21 18:57:36
【问题描述】:

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 进行客户端连接。 我一定遗漏了一些东西,也许命名空间搞砸了。有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc wcf


    【解决方案1】:

    如果客户端上的 .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);
            }
    

    【讨论】:

    • 得到不同的错误,但我认为你在正确的轨道上(除了缺少一些关于 DataContractSerializer 的参数类型)。新错误是“无法访问已关闭的流”。所以 reader 对象要么从未被打开或被提前关闭。不能说我曾经使用过它,所以我必须做一些调查。
    • using 周围的 var writer... 可能正在关闭正在返回的 MemoryStream。我将编辑答案以将其删除,看看它对您有什么作用。
    • 读取周围的新错误:来自命名空间“命名空间”的预期元素“ArrayOfNode”..遇到名称为“”,命名空间“”的“无”。我认为问题可能在于实际写入流。我开始调试写入过程,尽管有一个节点要写入,但流的长度仍然是 0。
    • 另一种可能性 - 流需要“倒带”到开头才能正确读取。再添加两行代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多