Hej! Då tror jag att någonstans omvandlas din binära sträng till annat format. Hade det varit binärt hela tiden hade ingen konvertering gjorts någonstans. Det är inte så att du har 8 bitar ASCII och får över det till 7 någonstans? Jag skapar aldrig någon fil när jag serialiserar. Jag använder MemoryStream och omvandlar till byte() array via MemoryStream.GetBuffer. Och det fungerar som det ska. Nej tyvärr. Har kollar efter något sätt att ändra formatet, men hittar bara en get-function som returnerar den aktuella kodningen. Har försökt att ändra via den, men den är som sagt read-only. Testa att skicka med encodingen när du skapar din StreamWriter. By default är den nog satt till UTF-8 istället för till Default. Tack!!! Detta är ett klassiskt problem eller totalt värdelös implementation av strömmar... jag fattar inte varför de alltid går på utf-8istället för default. Om man nu har en Encoding.Default som borde vara den Defaulta encodingen så borde väl de klasser som har med encoding att göra använda sig av den istället.. nåja, som vanlig måste man lusläsa dokumentationen... >jag fattar inte varför de alltid går på utf-8istället för default. Nä, visst är det så men jag tycker att det ställer till mer än hjälper. Det är ju hur många frågor som helst på just detta med varför det blir fel med strömmar, och på alla är lösningen att man måste behandla Encodingen. Det är ju en fråga om hur man ser på vad som är Default. >Det är ju hur många frågor som helst på just detta med varför det blir fel med strömmar, och på alla är lösningen att man måste behandla Encodingen.Tcp/Ip vs. BinaryFormatter
Behöver lite hjälp.
Försöker serialisera objekt med binary.binaryformatter och skicka dem via tcp/ip över till en annan applikation. Där ska de deserialiseras till objekt igen.
Problemet är att den text som skickas över tcp/ip ändras (den ändrar på visa chars, text chr(255) blir chr(195)+chr(192)) och skapar då problem vid deserialiseringen.
Hur ska man göra för att den byte() array man fick vid binformatter.serialize ska skickas över i sitt befintliga skicka till den andra applikationen?
Tacksam för tips!
//PärSv: Tcp/Ip vs. BinaryFormatter
Skapar du även filen binärt när den tagits emot?Sv: Tcp/Ip vs. BinaryFormatter
Jag tror den omvandlas när datan skickas/tas emot. Så här ser sändfunktionen ut.
Private Sub Send(ByVal c() As Char)
Dim w As New IO.StreamWriter(tcpKlient.GetStream)
w.Write(c, 0, c.Length)
w.Flush()
End Sub
Så för att skicka datan måste byte() arrayen omvandlas till char() array. Detta gör jag genom att loopa igen byte() arrayen och omvandla via chr().
Då får jag en char() array som är rätt kodad. Men när jag sedan skickar över den så ändras kodning på något sätt. Vet inte riktigt vad jag gör fel?
Man kanske ska använda sig av System.Text istället, typ:
dim by() as byte = memorystream.getbuffer
dim ch() as char = system.text.asciiencoding.ascii.getchars(by)
Problemet är hur man i så fall kodar tillbaka till samma kodning som den binära strängen hade från början? Några tips?Sv: Tcp/Ip vs. BinaryFormatter
Om jag omvandlar byte() arrayen till system.text.asciiencoding.ascii.getchars()
så fungerar det att skicka över datan. Problemet är då istället att kunna omvandla tillbaka till det binära formatet så att det fungerar att deserialisera.Sv: Tcp/Ip vs. BinaryFormatter
Alltså: Dim w As New IO.StreamWriter(tcpKlient.GetStream, System.Text.Encoding.Default)
Sen om du läser upp den på andra sidan så kan du ju kolla encodingen med byteordermarken (gissar att den skickas med oxå) i så fall kan du använda
konstruktorn i StreamReader med Stream och bool där bool är detectencodingfrombyteordermark...Sv: Tcp/Ip vs. BinaryFormatter
Det löste sig genom att ange encodingen när man skapade IO.StreamWriter. Underbart, ni har räddat min dag! Tusen tack Pelle och Arathorn!
//PärSv: Tcp/Ip vs. BinaryFormatter
Sv: Tcp/Ip vs. BinaryFormatter
Antagligen för att Default är systemberoende, och resultatet kan variera beroende på dina regionsinställningar.
Just därför bör du heller definitivt inte använda Default för text som ska kodas på en maskin och avkodas på en annan. Det finns ingen garanti att resultatet blir det samma då. UTF-8 eller UTF-16 är mycket bättre val för distribuerade system.
MSSv: Tcp/Ip vs. BinaryFormatter
Ex: om jag använder mig av strängar i mitt program så blir de encodade by default med Encoding.Default därför är det mer intuitivt att när jag sparar dem på disk eller skickar dem över ett nätverk att det fortfarande är samma encoding. Därmed är det inte sagt att den encodingen är bra, men jag anser att nånstans har man gjort ett feltänk eller så har man inte tänkt på att det är rätt många som har en annan encoding än just UTF-8, vilket ju gör jobbet lite jobbigare för oss....
Lite tankar bara...Sv: Tcp/Ip vs. BinaryFormatter
Jasså? De flesta såna frågor jag har sett har att göra med att läsa någon existerande textfil, och då är det klart att man måste tänka till en gång extra så man använder rätt kodning.
>Ex: om jag använder mig av strängar i mitt program så blir de encodade by default med Encoding.Default
I vilket sammanhang?
MS