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

如何在VB.net中通过命名管道发送类,vb.net,serialization,named-pipes,Vb.net,Serialization,Named Pipes,使用VB2008,我在两台计算机上有两个需要通信的应用程序。我设置了一个命名管道,到目前为止,它正在工作。我可以在这两个程序之间来回发送字符串 现在,我需要能够发送一个类或对象。我在某个地方读到过,序列化是一条出路。因此,关于客户,我有: Public Class cTest Dim Var1 As Boolean Dim Var2 As String = "a test" Dim Var3 As New Collections.ArrayList Publi

使用VB2008,我在两台计算机上有两个需要通信的应用程序。我设置了一个命名管道,到目前为止,它正在工作。我可以在这两个程序之间来回发送字符串

现在,我需要能够发送一个类或对象。我在某个地方读到过,序列化是一条出路。因此,关于客户,我有:

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
在服务器端(远程计算机上):

serializer.Deserialize引发异常,表示XML格式不正确

我做错了什么


感谢您的时间和帮助

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

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

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

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


在这里进一步讨论一个分支,但是您可能会看到ctest对象的名称空间是不同的。如果是这种情况,在两个应用程序之间共享的库中定义共享类可能会有所帮助

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

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


在这里进一步讨论一个分支,但是您可能会看到ctest对象的名称空间是不同的。如果是这种情况,在两个应用程序之间共享的库中定义共享类可能会有所帮助

经过大量测试和谷歌搜索,我终于找到了答案:

在客户端使用以下代码时,它可以工作:

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

最后,经过大量测试和谷歌搜索,我发现:

在客户端使用以下代码时,它可以工作:

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