【问题标题】:BinaryFormatter throws exception, recommended solution did not workBinaryFormatter 抛出异常,推荐的解决方案不起作用
【发布时间】:2017-10-27 01:17:47
【问题描述】:

所以我一直在为学校作业构建一个应用程序,它是一个适合我学校筹款日的投注应用程序。它允许您对当天某些事件的结果进行投注,例如哪支球队将赢得泡泡足球,或者谁将赢得师生辩论,等等。我需要在某个地方存储许多事件及其结果,事件和结果是单独的对象。有人告诉我最好的存储方式是二进制。为此,我被告知要创建另一个应用程序,这将允许我创建、编辑和删除这些对象,然后将它们序列化为二进制文件,以便稍后由应用程序反序列化。序列化为二进制工作。应用程序方面的反序列化,并没有那么多。

这是序列化器:

namespace MazBrokes_Editor
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
        {
        private List<Event> mEvents;
        private List<string> mEventNames = new List<string>();

        private Dictionary<Event, Outcome> mOutcomesToRemove = null;

        private List<string> mOutcomeNames;
        private static string file;
        private Event SelectedEvent = null;
        private Outcome SelectedOutcome = null;

        public MainWindow()
        {
            InitializeComponent();
        }


        private void btnEventAdd_Click(object sender, RoutedEventArgs e)
        {
            mEvents.Add(new Event(
                    txtEventName.Text,
                    txtEventType.Text,
                    txtEventDesc.Text,
                    new List<Outcome>()
                ));

        }

        private void btnAddOutcome_Click(object sender, RoutedEventArgs e)
        {
            if (txtEventOrigin.Text == "")
            {

              SelectedEvent.Outcomes.Add(new Outcome(txtName.Text, txtProbability.Text, txtPrizeDesc.Text, txtBetMultiplier.Text));

            }

            foreach (var item in mEvents)
            {

                if (item.eventName != txtEventOrigin.Text)
                {
                    continue;
                }

                else
                {
                    item.Outcomes.Add(new Outcome(txtName.Text, txtProbability.Text, txtPrizeDesc.Text, txtBetMultiplier.Text));
                }
            }
            Clear();
        }

        private void btnSerialize_Click(object sender, RoutedEventArgs e)
        {


            using (Stream stream = File.Open(file, FileMode.Create))
            {
                var binaryformatter = new BinaryFormatter();

                binaryformatter.Serialize(stream, mEvents);
            }

        }


            private void btnDeserialize_Click(object sender, RoutedEventArgs e)
            {
                FileStream fs = File.Open(file, FileMode.Open);

                BinaryFormatter formatter = new BinaryFormatter();


                mEvents = formatter.Deserialize(fs) as List<Event>;

                foreach(var item in mEvents)
                {
                    mEventNames.Add(item.eventName);
                }

                fs.Flush();
                fs.Close();
                fs.Dispose();

                lstDesirializedObjects.ItemsSource = mEventNames;

            }

            private void lstDesirializedObjects_MouseDoubleClick(object sender, MouseButtonEventArgs e)
            {
                    mOutcomeNames = new List<string>();

                   foreach (var item in mEvents)
                   {
                        if (lstDesirializedObjects.SelectedItem.ToString() != item.eventName)
                        {
                            continue;
                        }
                        else
                        {
                            txtEventName.Text = item.eventName;
                            txtEventDesc.Text = item.Description;
                            txtEventType.Text = item.eventType;
                            SelectedEvent = item;
                                foreach(var outcome in SelectedEvent.Outcomes)
                                {
                                    mOutcomeNames.Add(outcome.Name);

                                }
                                lstDesirializedOutcomes.ItemsSource = mOutcomeNames;

                        }
                   }

            }

        private void BtnEventEdit_Click(object sender, RoutedEventArgs e)
        {
            SelectedEvent.eventName = txtEventName.Text;
            SelectedEvent.Description = txtEventDesc.Text;
            SelectedEvent.eventType = txtEventType.Text;


        }

        private void lstDesirializedOutcomes_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            foreach (var item in SelectedEvent.Outcomes)
            {
                if (lstDesirializedOutcomes.SelectedItem.ToString() != item.Name)
                {
                    continue;
                }
                else
                {

                    txtName.Text = item.Name;
                    txtProbability.Text = item.oddsArray[0] + "/" + item.oddsArray[1];
                    txtPrizeDesc.Text = item.Prize;
                    txtBetMultiplier.Text = Convert.ToString(item.mPayout);
                    SelectedOutcome = item;

                }
            }
        }

        private void btnEditOutcome_Click(object sender, RoutedEventArgs e)
        {
            SelectedOutcome.Name = txtName.Text;
            SelectedOutcome.oddsArray = txtProbability.Text.Split('/');
            SelectedOutcome.Prize = txtPrizeDesc.Text;
            SelectedOutcome.mPayout = Convert.ToDouble(txtBetMultiplier.Text);

            Clear();

        }

        private void btnDeleteOutcome_Click(object sender, RoutedEventArgs e)
        {
            mOutcomesToRemove = new Dictionary<Event, Outcome>();
            foreach (var Event in mEvents)
            {
                foreach (var outcome in Event.Outcomes)
                {
                    if (SelectedOutcome != outcome)
                    {
                        continue;
                    }
                    else
                    {
                        //Event.Outcomes.Remove(outcome);
                        mOutcomesToRemove.Add(Event, outcome);
                    }
                }
            }
            foreach (var item in mOutcomesToRemove)
            {
                item.Key.Outcomes.Remove(item.Value);
            }
        }

        private void DeleteOutcome(Event evvent, Outcome outcome)
        {
            evvent.Outcomes.Remove(outcome);
        }

        private void btnDeleteevent_Click(object sender, RoutedEventArgs e)
        {
            mEvents.Remove(SelectedEvent);
        }

        public void Clear()
        {
            txtEventOrigin.Text = "";
            txtName.Text = "";
            txtProbability.Text = "";
            txtPrizeDesc.Text = "";
            txtBetMultiplier.Text = "";
        }
    }
}`

反序列化器:

namespace MazBrokes
{
    class configParser
    {

        public static void SerializeParse()
        {

            BinaryFormatter formatter = new BinaryFormatter();
            SlidingTabFragment.UpcomingEvents.mEvents = formatter.Deserialize(MainActivity.assets.Open("MazBrokesData.bin")) as List<Events>;

        }


    }

}

我被抛出了这里详述的异常: BinaryFormatter deserialize gives SerializationException.

我尝试了推荐的修复方法,但这只会导致更多错误。

非常感谢您提供的任何帮助,如果我可以提供更多信息,请说。

【问题讨论】:

  • 您是否有不能使用 JSON 进行数据传输的原因?处理起来容易得多
  • 我会调查的,谢谢,杰森。

标签: c# wpf xamarin serialization deserialization


【解决方案1】:

事实证明,答案是完全放弃使用二进制文件。评论者 Jason 告诉我有关 JSON 的信息,我保留了编辑器程序,但不是序列化为二进制,而是序列化为 JSON,主应用程序能够无错误地解释它。

【讨论】:

    猜你喜欢
    • 2014-12-09
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2021-10-23
    • 2022-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多