如何通过VB.net中的命名管道发送类

时间:2012-11-01 16:01:42

标签: vb.net serialization named-pipes

使用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格式不正确。

我做错了什么?

感谢您的时间和帮助

3 个答案:

答案 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对象的名称空间不同。如果是这种情况,则可以帮助在两个应用程序之间共享的库中定义共享类。