ObservableCollection二进制序列化和通过网络传输

时间:2013-07-01 18:11:27

标签: c# wpf

ka有一个小问题。有一个班级

    public class PLayer
{
public String Name{get;set;}
public TimeSpan Tax { get; set; }

}

主要表格

 public partial class MainWindow : Window
{
public ObservableCollection<PLayer> PlayersInGame { get; set; }
public ObservableCollection<PLayer> PlayersInGame2 { get; set; }
public ObservableCollection<PLayer> PlayersOnBench { get; set; }

public MainWindow()
{
PlayersInGame = new ObservableCollection<PLayer>();
PlayersInGame2 = new ObservableCollection<PLayer>();

PlayersOnBench = new ObservableCollection<PLayer>();

InitializeComponent();

}


private void Button_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 10; i++)
{
String vName = "Игрок" + i.ToString();
PlayersInGame.Add(new PLayer { Name = vName, Tax = new TimeSpan(0) });
}
for (int i = 10; i < 20; i++)
{
String vName = "Игрок" + i.ToString();
PlayersInGame2.Add(new PLayer { Name = vName, Tax = new TimeSpan(0) });
}
Game.Items.Refresh();
}

private void Button2_Click(object sender, RoutedEventArgs e)
{
if (Game.SelectedIndex > -1)
{
var temp = PlayersInGame[Game.SelectedIndex];
//PlayersInGame.RemoveAt(Game.SelectedIndex);
temp.Tax = new TimeSpan(0, 0, 5);
PlayersOnBench.Add(temp);
Game.Items.Refresh();
Bench.Items.Refresh();
}
if (Game2.SelectedIndex > -1)
{
var temp = PlayersInGame2[Game2.SelectedIndex];
//PlayersInGame2.RemoveAt(Game2.SelectedIndex);
temp.Tax = new TimeSpan(0, 0, 5);
PlayersOnBench.Add(temp);
Game2.Items.Refresh();
Bench.Items.Refresh();
}
}

private void timer_Tick(object sender, EventArgs e)
{
foreach (var x in PlayersOnBench)
{
x.Tax -= new TimeSpan(0, 0, 1);
}

List<int> Temp = new List<int>();
for (var i = 0; i < PlayersOnBench.Count; i++)
{
if (PlayersOnBench[i].Tax == TimeSpan.Zero)
{
Temp.Add(i);

}
}
for (int i = Temp.Count - 1; i >= 0; i--)
{
var s = PlayersOnBench[i];



PlayersOnBench.RemoveAt(Temp[i]);
//PlayersInGame.Add(s);
//Game.Items.Refresh();


}
Bench.Items.Refresh();
}
}

在主窗体上单击按钮时,“Button2_Click”行将添加到ListView“Bench”并添加一个计时器。在“timer_Tick”的处理中,计时器正在计算添加到“Bench”的所有行。联系ossushestvlyaetsya一个绑定。我的问题是了解二进制序列化,如何将ListView“Bench”的内容传输到服务器以显示在ListView或ListBox中。项目的二进制序列化已用于发送文本字段。

1 个答案:

答案 0 :(得分:0)

你的问题有点不清楚你想要达到的目标。通常,如果使用二进制序列化,它会将对象转换为字节数组,需要反序列化才能使对象恢复。以下是样本

    BinaryFormatter m_formatter;
    Byte[] m_stateData;
    List<T> cloned_objList;

    public binaryserializer(List<T> PlayersOnBench)
    {
        if ((!Object.ReferenceEquals(listToClone, null)) && (typeof(T).IsSerializable))
        {
            m_formatter = new BinaryFormatter();
            using (MemoryStream stream = new MemoryStream())
            {
                try
                {
                    m_formatter.Serialize(stream, PlayersOnBench);
                }
                catch { }

                stream.Seek(0, SeekOrigin.Begin);
                m_stateData = stream.ToArray();
            }
        }
    }

    public List<T> BenchStates
    {
        get
        {
            using (MemoryStream stream = new MemoryStream(m_stateData))
            {
                try
                {
                    cloned_objList = (List<T>)m_formatter.Deserialize(stream);
                }
                catch (Exception) { }
            }
            return cloned_objList;
        }
    }