1

使用 VB2008,我在需要通信的 2 台计算机上有 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 格式不正确。

我做错了什么?

感谢您的时间和帮助

4

3 回答 3

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
于 2012-11-02T12:34:00.690 回答
0

如果我是你,我会使用 WCF 自托管服务并让两者使用回调进行通信

于 2012-11-01T16:06:02.687 回答
0

这开始是一个评论,但我的空间已经用完了。我不是命名管道通信方面的专家,但是已经有几个小时了,这可能不是真正的问题。

您需要首先在同一个应用程序中测试序列化/反序列化。换句话说,首先从图片中取出管道。这将隔离这是序列化问题还是命名管道问题。假设您的代码在同一个应用程序中完成时可以工作,那么您需要比较两个应用程序生成的 xml - 让它们都执行序列化。如果 xml 相同(我对此表示怀疑),则将其通过管道并再次进行比较。

在这里走得更远,但您可能会看到 ctest 对象的命名空间不同。如果是这种情况,在两个应用程序之间共享的库中定义共享类可能会有所帮助。

于 2012-11-01T18:36:20.990 回答