#4 Mutagen
Poradil bys mi prosím ještě s tím kodem? Když jsem si ho zkusil v jednom programu, tak to šlo v poho serializovat a opět Deserializovat, tak jsem to zkusil aplikovat na klienta a server a hází mi to v metodě Deserialize tuto chybu: System.InvalidCastException: 'Unable to cast object of type 'System.Byte' to type 'TCPRecever.Movement'.'
Přitom struktury obou tříd jak na klientovi, tak i na serveru jsou stejné, jediné co se teda liší je namespace, ale to by snad vadit tomu nemělo, jediné co si říkám, že by tomu možná mohlo vadit je, že na klientské části přijímám ty byty do většího pole, ale tak za tím jsou pak nuly, které snad značí konec řetězce
Nevíš prosím kde jsem udělal chybu?
Tohle je serverovská část:
using System;
using System.IO;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Runtime.Serialization.Formatters.Binary;
namespace TCPRecever
{
class Program
{
private const Int32 port = 2050;
static void Main(string[] args)
{
Thread thread = new Thread(new ThreadStart(Listen));
Console.WriteLine("Nasloucham..");
thread.Start();
}
public static void Listen()
{
TcpListener tcpListener = new TcpListener(IPAddress.Any, port);
tcpListener.Start();
while (true)
{
TcpClient tcpClient = tcpListener.AcceptTcpClient();
NetworkStream ns = tcpClient.GetStream();
byte[] buffer = new byte[1024];
int recv = 0;
ns.Read(buffer, 0, buffer.Length);
foreach (byte b in buffer)
if (b != 0)
recv++;
Movement newMovement = Deserialize<Movement>(buffer);
Console.WriteLine("Trida {0}", newMovement.X);
Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, recv));
Console.WriteLine();
StreamWriter sw = new StreamWriter(tcpClient.GetStream());
sw.WriteLine("you rock!");
sw.Flush();
}
//tcpClient.Close();
//tcpListener.Stop();
}
public static T Deserialize<T>(byte[] aData)
{
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream(aData))
{
return (T)formatter.Deserialize(ms);
}
}
}
}
a tohle klientská:
using System.Net.Sockets;
using System.Net;
using System;
using System.Text;
using System.IO;
using System.Collections.Generic;
using System.Threading;
using System.Runtime.Serialization.Formatters.Binary;
namespace TCPClient
{
class Program
{
private static TcpClient client = null;
private static NetworkStream netStream = null;
static void Main(string[] args)
{
Movement mv = new Movement(5, 5, 5);
try
{
while (true)
{
byte[] byteBuffer = Serialize<Movement>(mv);
client = new TcpClient("192.168.1.107", 2050);
Console.WriteLine("Spojeni navazano..odesilam");
netStream = client.GetStream();
netStream.Write(byteBuffer, 0, byteBuffer.Length);
Console.WriteLine("Odeslano");
netStream.Flush();
StreamReader sr = new StreamReader(netStream);
Console.WriteLine(sr.ReadLine());
Console.WriteLine("konec");
netStream.Close();
client.Close();
}
}
catch(Exception ex)
{
Console.WriteLine("CHYBA{0}",ex);
}
}
public static byte[] Serialize<T>(T aData)
{
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
byte mujByte = 0x09;
formatter.Serialize(ms, mujByte);
formatter.Serialize(ms, aData);
return ms.ToArray();
}
}
}
}
A tohle třída
using System;
using System.Collections.Generic;
using System.Text;
namespace TCPRecever
{
[Serializable]
class Movement
{
public float X;
public float Y;
public float Z;
public Movement(float x, float y, float z)
{
this.X = x;
this.Y = y;
this.Z = z;
}
}
}