使用VB2008,我在两台需要通信的计算机上有2个应用程序。我设置了一个命名管道,到目前为止,它正在工作。我可以在这两个程序之间来回发送字符串。
现在,我需要能够发送一个类或一个对象。我已经阅读过序列化的方法。所以,在客户端,我有:
Public Class cTest
Dim Var1 As Boolean
Dim Var2 As String = "a test"
Dim Var3 As New Collections.ArrayList
Public Sub AddItem(ByVal Item As String)
Var3.Add(Item)
End Sub
End Class
Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
Dim oClasse As New cTest
oClasse.AddItem("StarWars")
oClasse.AddItem("StarTrek")
oPipe.SendToPipe(oClasse)
End Sub
End Class
Public Sub SendToPipe(ByVal test As cTest)
Dim xmlTest As New Xml.Serialization.XmlSerializer(GetType(cTest))
xmlTest.Serialize(pipeClient, test)
End Sub
在服务器端(在远程计算机上):
Public Function ReadString() As String
Dim len As Integer = 0
len = CType(ioStream.ReadByte(), Integer) * 256
len += CType(ioStream.ReadByte(), Integer)
Try
Dim serializer As New Xml.Serialization.XmlSerializer(GetType(cTest))
Dim Test As cTest
Test = CType(serializer.Deserialize(ioStream), cTest)
Catch ex As Exception
End Try
End Function
serializer.Deserialize抛出一个异常,说XML格式不正确。
我做错了什么?
感谢您的时间和帮助
答案 0 :(得分:1)
最后,经过大量测试和谷歌搜索,我发现了它:
在客户端使用以下代码时,它可以工作:
Dim oClasse As New cTest
oClasse.AddItem("StarWars")
oClasse.AddItem("StarTrek")
Using PStream As IO.Pipes.NamedPipeClientStream = New IO.Pipes.NamedPipeClientStream(".", "VisionEnginePipeRead1", PipeDirection.Out, PipeOptions.None, TokenImpersonationLevel.None)
PStream.Connect()
Dim xmlTest As New Xml.Serialization.XmlSerializer(GetType(cTest))
xmlTest.Serialize(PStream, oClasse)
End Using
这一点,在服务器端:
Dim Test As cTest
Using PStream As NamedPipeServerStream = New NamedPipeServerStream(pipeName, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.None)
PStream.WaitForConnection()
Dim serializer As New Xml.Serialization.XmlSerializer(GetType(cTest))
Test = CType(serializer.Deserialize(PStream), cTest)
End Using
答案 1 :(得分:0)
如果我是你,我会使用WCF自托管服务,让两者使用回调进行通信
答案 2 :(得分:0)
这开始是一个评论,但我的空间不足。我不是命名管道通信方面的专家,但它已经有几个小时了,可能这不是真正的问题。
您需要首先在同一个应用程序中测试序列化/反序列化。换句话说,首先从管道中取出管道。这将隔离这是序列化问题还是命名管道问题。假设你的代码在同一个应用程序中完成后会有效,那么你需要比较两个应用程序生成的xml - 让它们都执行Serialize。如果xml是相同的(我怀疑),那么将它传递给管道并再次进行比较。
在这里更进一步,但你可能会发现ctest对象的名称空间不同。如果是这种情况,则可以帮助在两个应用程序之间共享的库中定义共享类。