Я пытаюсь сериализовать C# объектов в строку JSON, а затем отправить ее по сети на сервер. Тем не менее, сервер никогда не получает объекты. Я попытался поиграть с настройками JsonSerializer, установив для TypeNamehandling значение Obejcts, но это тоже не сработало. Мне также не нравится преобразовывать JSON -String в байты и отправлять их таким образом, потому что тогда мне нужно найти способ передать sh используемый мной NetworkStream, и в настоящее время этот поток всегда открыт.
Я не нашел решения в Интернете. Я надеюсь, что кто-то здесь может мне помочь. Весь код загружен на мой GitHub!
Код моего клиента:
public void Serialize(object value)
{
StreamWriter streamWriter = new StreamWriter(Stream);
JsonWriter jsonWriter = new JsonTextWriter(streamWriter);
jsonSerializer.Serialize(jsonWriter, value,typeof(Message));
}
public Message Deserialize()
{
StreamReader streamReader = new StreamReader(Stream);
JsonReader jsonReader = new JsonTextReader(streamReader);
return jsonSerializer.Deserialize<Message>(jsonReader);
}
Код моего сервера
public void Serialize(Stream stream, object value)
{
StreamWriter streamWriter = new StreamWriter(stream);
JsonWriter jsonWriter = new JsonTextWriter(streamWriter);
jsonSerializer.Serialize(jsonWriter, value,typeof(Message));
}
public Message Deserialize(Stream stream)
{
StreamReader streamReader = new StreamReader(stream);
JsonReader jsonReader = new JsonTextReader(streamReader);
return jsonSerializer.Deserialize<Message>(jsonReader);
}
И объект сообщения выглядит так
[Serializable]
public class StartupMessage : Message
{
public string Username { get; set; }
public StartupMessage(string username)
{
Username = username ?? throw new ArgumentNullException(nameof(username));
}
}
Edit : Еще немного кода от моего клиента, который показывает, как и с чем я отправляю объекты:
public string Username { get; }
public string ServerIP { get; }
//private readonly BinaryFormatter Formatter;
private readonly JsonSerializer jsonSerializer;
private readonly TcpClient Server;
private readonly NetworkStream Stream;
public event EventHandler<NewMessageEventArgs> NewMessage;
public Client(string username, string serverIP)
{
Username = username ?? throw new ArgumentNullException(nameof(username));
ServerIP = serverIP ?? throw new ArgumentNullException(nameof(serverIP));
//Formatter = new BinaryFormatter();
Server = new TcpClient(ServerIP, Message.Port);
Stream = Server.GetStream();
var settings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Objects
};
jsonSerializer = JsonSerializer.Create(settings);
}
public void Start()
{
Serialize(new StartupMessage(Username));
var recieverThread = new Thread(() =>
{
while (true)
{
Message msg = Deserialize();
if(msg is ConnectedMessage)
{
Console.WriteLine("Connected!");
}
if(msg is MessageMessage message)
{
OnNewMessage(new NewMessageEventArgs(message.Message, message.Username));
}
}
});
recieverThread.Start();
}
Редактировать 2 :
private readonly List<ClientInfo> clientInfos;
//private readonly BinaryFormatter formatter;
private readonly TcpListener tcpListener;
private readonly JsonSerializer jsonSerializer;
public EventHandler<NewMessageEventArgs> NewMessage;
public Server()
{
clientInfos = new List<ClientInfo>();
//formatter = new BinaryFormatter();
tcpListener = new TcpListener(IPAddress.Any, Message.Port);
var settings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Objects
};
jsonSerializer = JsonSerializer.Create(settings);
}
public void Start()
{
while (true)
{
tcpListener.Start();
TcpClient client = tcpListener.AcceptTcpClient();
var recieverThread = new Thread(() =>
{
NetworkStream stream = client.GetStream();
while (true)
{
Message msg = Deserialize(stream);
if (msg is StartupMessage startup)
{
OnNewMessage(new NewMessageEventArgs("CONNECTED", startup.Username),true);
string username = startup.Username;
clientInfos.Add(new ClientInfo(username, stream));
Serialize(stream, new ConnectedMessage());
}
if (msg is MessageMessage message)
{
OnNewMessage(new NewMessageEventArgs(message.Message, message.Username),false);
foreach (ClientInfo info in clientInfos)
{
Serialize(info.Stream, message);
}
}
}
});
recieverThread.Start();
}
}