2013-11-18 5 views
0

Во-первых, я хотел бы определить проблему.
Я должен написать модуль связи между клиентом и сервером.
Что делает клиент?
- посылает Рапорт на сервер ---> sendReport (Raport Raport)
- получает specyfic Рапорт от сервера -> getReport() метод
- получает список Информация о доступных raports ----> getRaportsInfo()
Модуль сервера клиентов C#, сериализация Не работает

класс

Клиент http://pastebin.com/344kfcbh

Что сервер сделать?
- получает запросы от клиента (на основе первого байта в потоке)
Class Server http://pastebin.com/wBwFPRpK

Сообщить Class

namespace OtherClasses 
    { 
    [Serializable] 
    public class Raport 
    { 
    public int day; 
    public int month; 
    public int year; 

    public Raport(int d, int m, int y) 
    { 
     day = d; 
     month = m; 
     year = y; 
    } 

    public void show() 
    { 

     Console.WriteLine("DAY=" + day + " MONTH=" + month + "YEAR=" + year); 

    } 

} 

}

где-то в питающей сети

Server s = new Server(); 
s.acceptConnection(); 
Client c = new Client(); 
Raport r1 = new Raport(1, 1, 1); 
c.connect("127.0.0.1"); 
c.sendReport(r1); 

Проблема: видимо, после прочтения первого байта из потока я не могу десериализовать.
Я получаю ошибку «Входной поток не является допустимым двоичным форматом.»
SerializationException
Как я могу десериализацию из моего потока после прочтения первого байта

+0

Является ли этот класс Raport скопирована в обоих проектах? Или это в библиотеке (dll), на которую ссылаются оба проекта? –

+0

Btw - использование BinaryWriter и необработанного потока запутывает, и я считаю здесь неправильным: вы делаете «пишите 3 на писателя», «сериализуете в поток», «флеш-писатель». Должно быть «писать 3 на писателя,« писатель-флеш »,« сериализовать на поток »или даже лучше:« писать 3 в поток, сериализовать в поток »(потерять писателя) –

+0

Дополнительная информация: 3, которые вы пишете, не байт, но вы читали его так, как если бы это было. –

ответ

0

Возможно включить команду в классе? Используйте разные классы, чтобы указать необходимые данные. Что-то вроде:

public enum RaportType {specific,general}; 

[Serializable] 
public class RaportSpecific 
{ 
    public List<string> Data = new List<string>() { "One", "Two" }; 
} 

[Serializable] 
public class Raport 
{ 
    public RaportType RaportType = RaportType.specific; 
    public RaportSpecific Test = null; //new RaportSpecific(); 

..

Сервер:

IFormatter formatter = new BinaryFormatter(); 
Raport receivedRaport = (Raport)formatter.Deserialize(n); 
switch (receivedRaport.RaportType) 
{ 

    case RaportType.general: 
     Debug.WriteLine("You wanted to getRaportsInfo()"); 
     /// to be implemented 
     break; 

    case RaportType.specific: 
     Debug.WriteLine("I've received your raport"); 
     receivedRaport.show(); 
     break; 
Смежные вопросы