MVC 4.0
我在服务上运行以下内容:
[OperationContract(Name = "GetHierarchyReportContents")]
[FaultContract(typeof(InvalidHierarchyNameException))]
[ServiceKnownType(typeof(Node))]
MemoryStream GetContents();
此函数提供一个内存流,其中包含一个Node列表(由于别名而为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,Version = 1.0.0.0,Culture = neutral, 公钥=空”。
我正在使用wsHttpBinding
进行客户端连接。
我必须遗漏一些东西,也许命名空间搞砸了。有什么想法吗?
答案 0 :(得分: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);
}