а List разве сериализуемый? Либо создайте свой сериализуемый лист, либо сконвертируйте его в byte[] или еще проще, в string с разделителем.
А вообще, для передачи по сети дарю вам два своих удобных класса:
Используется csharp
using System;
using System.IO;
using System.Text;
public class DataOut {
private MemoryStream ms;
private BinaryWriter bw;
public DataOut() {
ms = new MemoryStream();
bw = new BinaryWriter(ms);
}
public void clear() {
ms = new MemoryStream();
bw = new BinaryWriter(ms);
}
public void close() {
ms.Close();
bw.Close();
bw = null;
ms = null;
}
public byte[] getBytes() {
return ms.ToArray();
}
public void writeDateTime(DateTime dt) {
// return new DateTime(readShort(), readShort(), readShort(), readShort(), readShort(), readShort());
writeShort((short)dt.Year);
writeShort((short)dt.Month);
writeShort((short)dt.Day);
writeShort((short)dt.Hour);
writeShort((short)dt.Minute);
writeShort((short)dt.Second);
}
public void writeVector3(MVector vec) {
bw.Write(vec.X);
bw.Write(vec.Y);
bw.Write(vec.Z);
}
public void writeInt(int aval) {
bw.Write(aval);
}
public void writeLong(long aval) {
bw.Write(aval);
}
public void writeFloat(float aval) {
bw.Write(aval);
}
public void writeDouble(double aval) {
bw.Write(aval);
}
public void writeShort(short aval) {
bw.Write(aval);
}
public void writeByte(byte aval) {
bw.Write(aval);
}
public void writeBytes(byte[] aval) {
bw.Write((byte[])aval);
}
public void writeBool(bool aval) {
writeByte((byte)(aval == true ? 1 : 0));
}
public void writeString(string astr) {
if (astr != null) {
UTF8Encoding encoding = new UTF8Encoding();
byte[] bytes = encoding.GetBytes(astr);
writeShort((short)bytes.Length);
writeBytes(bytes);
} else {
writeShort((short)0);
}
}
}
Используется csharp
using System;
using System.IO;
using System.Text;
public class DataIn {
private MemoryStream _ms;
private BinaryReader _bw;
private readonly long _length;
private long _index;
public DataIn(byte[] data) {
_index = 0;
_ms = new MemoryStream(data);
_length = data.Length;
_index = 0;
_bw = new BinaryReader(_ms);
}
public void close() {
_ms.Close();
_bw.Close();
_bw = null;
_ms = null;
}
public bool eof {
get {
return _index >= _length;
}
}
public MVector readVector3() {
return new MVector(readDouble(), readDouble(), readDouble());
}
public byte[] readAll() {
return readBytes((int)(_length - _index));
}
public int readInt() {
_index += 4;
return _bw.ReadInt32();
}
public long readLong() {
_index += 8;
return _bw.ReadInt64();
}
public float readFloat() {
_index += 4;
return _bw.ReadSingle();
}
public DateTime readDateTime() {
return new DateTime(readShort(), readShort(), readShort(), readShort(), readShort(), readShort());
}
public double readDouble() {
_index += 8;
return _bw.ReadDouble();
}
public short readShort() {
_index += 2;
return _bw.ReadInt16();
}
public byte readByte() {
_index += 1;
return _bw.ReadByte();
}
public byte[] readBytes(int count) {
_index += count;
return _bw.ReadBytes(count);
}
public bool readBool() {
_index += 1;
return _bw.ReadByte() == 1;
}
public string readString() {
int cnt = readShort();
if (cnt <= 0) {
return "";
}
byte[] strb = readBytes(cnt);
return Encoding.UTF8.GetString(strb);
}
}
Работаем с ними так, на примере вашего листа:
Отправка данных:
Используется csharp
List<string> lst = new List<string>();
******************
DataOut os = new DataOut();
try {
os.writeInt(lst.Count);
foreach (var str in lst) {
os.writeString(str);
}
send("cmd", os.getBytes());
} finally {
os.close();
}
Приём данных:
Используется csharp
DataIn din=new DataIn(bytes);
List<string> lst = new List<string>();
int lcnt = din.readInt();
for (int indx = 0; indx < lcnt; indx++) {
lst.Add(din.readString());
}
разумеется, классы умеют передавать и принимать самые разнородные данные в одном потоке. Всё, что нужно, это просто научить ваши классы записываться и читаться из потока.