Từ 1 tới 3 trên tổng số 3 kết quả

Đề tài: Serialization với mảng dữ liệu

  1. #1
    Ngày gia nhập
    08 2008
    Bài viết
    7

    Unhappy Serialization với mảng dữ liệu

    Hi all.
    Mình mới tự học C# nhưng gặp phải vấn đề khi lưu mảng dữ liệu vào file.
    Mình dùng BinaryFormatter.
    Code:
    [Serializable()]
        class OscChannel : ISerializable
        {
            public bool Status;        // Trang thai kenh tat hay bat
            public string IdChannel;   // Ten kenh
            public string Infor;       // Thong tin ve kenh
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2500)]
            public byte[] data;        // Du lieu cua kenh;
    
            public OscChannel()
            {
                Status = false;
                IdChannel = "ch1";
                Infor = "nothing";
                data = new byte[2500];
                for (int i = 0; i < 2500; i++) data[i] = 0;
            }
            public OscChannel(string id, string info)
            {
                Status = false;
                IdChannel = id;
                Infor = info;
                data = new byte[2500];
                for (int i = 0; i < 2500; i++) data[i] = 0;
            }
            // Deserialize
            public OscChannel(SerializationInfo info, StreamingContext ctxt)
            {
                Status = (bool)info.GetValue("status", typeof(bool));
                IdChannel = (String)info.GetValue("idchannel", typeof(string));
                Infor = (String)info.GetValue("channelInfor", typeof(string));
    
    // Biết sai ở đây nhưng mình chưa tìm được cách lưu mảng này kiểu gì
    // Ai giúp mình với
                for (int i = 0; i < 2500; i++)
                {
                    data[i] = (byte)info.GetValue("data",typeof(byte));
                }
            }
            // Get object data
            public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
            {
                //You can use any custom name for your name-value pair. But make sure you
                // read the values with the same name. 
                info.AddValue("status", Status);
                info.AddValue("idchannel", IdChannel);
                info.AddValue("channelInfor", Infor);
                for (int i = 0; i < 2500; i++)
                {
                    info.AddValue("data", data[i]);
                }
            }
        }
        [Serializable()]
        class Oscillo : ISerializable
        {
            public string SysInfo;
            public OscChannel chanel1;
            public OscChannel chanel2;
            public OscChannel chanel3;
            public OscChannel chanel4;
            public Oscillo()
            {
                SysInfo = "";
                chanel1 = new OscChannel("ch1","");
                chanel2 = new OscChannel("ch2","");
                chanel3 = new OscChannel("ch3","");
                chanel4 = new OscChannel("ch4","");
            }
            // Deserialize
            public Oscillo(SerializationInfo info, StreamingContext ctxt)
            {
                SysInfo = (string)info.GetValue("sysInfo", typeof(string));
                chanel1 = (OscChannel)info.GetValue("channel1", typeof(OscChannel));
                chanel2 = (OscChannel)info.GetValue("channel2", typeof(OscChannel));
                chanel3 = (OscChannel)info.GetValue("channel3", typeof(OscChannel));
                chanel4 = (OscChannel)info.GetValue("channel4", typeof(OscChannel));
            }
            public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
            {
                info.AddValue("sysInfo", SysInfo);
                info.AddValue("channel1", chanel1);
                info.AddValue("channel2", chanel2);
                info.AddValue("channel3", chanel3);
                info.AddValue("channel4", chanel4);
            }
        }
    vấn đề là mình bị lỗi khi lưu tới mảng byte[] data.
    for (int i = 0; i < 2500; i++)
    {
    data[i] = (byte)info.GetValue("data",typeof(byte));
    }
    cám ơn mọi người quan tâm
    Đã được chỉnh sửa lần cuối bởi hungdlbk : 18-08-2008 lúc 03:46 PM.

  2. #2
    Ngày gia nhập
    07 2007
    Bài viết
    41

    Cách sửa đơn giản nhất là bỏ cai interface và cái Deserialize Contructor đi:

    Visual C# Code:
    1.     [Serializable]
    2.     class OscChannel // : ISerializable
    3.     {
    4.         public bool Status;        // Trang thai kenh tat hay bat
    5.         public string IdChannel;   // Ten kenh
    6.         public string Infor;       // Thong tin ve kenh
    7.         [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2500)]
    8.         public byte[] data;        // Du lieu cua kenh;
    9.  
    10.         public OscChannel()
    11.         {
    12.             Status = false;
    13.             IdChannel = "ch1";
    14.             Infor = "nothing";
    15.             data = new byte[2500];
    16.             for (int i = 0; i < 2500; i++) data[i] = 0;
    17.         }
    18.  
    19.         public OscChannel(string id, string info)
    20.         {
    21.             Status = false;
    22.             IdChannel = id;
    23.             Infor = info;
    24.             data = new byte[2500];
    25.             for (int i = 0; i < 2500; i++) data[i] = 0;
    26.         }
    27.     }

    Lỗi của cậu là Add 2 object vào info object với cùng tên ("data"), với lại trong contructor có chỗ cậu chưa khởi tạo data đã sử dụng Indexer (data[i] = ...).

    Nếu vẫn muốn giữ 2 cái hàm đó thì lúc AddValue vào Add cả cục data luôn:
    Visual C# Code:
    1. info.AddValue("data", data);

    khi deserialize cũng deserialize cả cục:
    Visual C# Code:
    1. data = (byte[])info.GetValue("data", typeof(byte[]));

    PS: cái deserialize constructor để public làm gì? nên để protected đủ rồi.
    Đã được chỉnh sửa lần cuối bởi zxc : 18-08-2008 lúc 05:51 PM.

  3. #3
    Ngày gia nhập
    08 2008
    Bài viết
    7

    Trích dẫn Nguyên bản được gửi bởi zxc Xem bài viết
    Cách sửa đơn giản nhất là bỏ cai interface và cái Deserialize Contructor đi:
    PS: cái deserialize constructor để public làm gì? nên để protected đủ rồi.
    Cám ơn bạn đã trả lời.
    Mình thử xem sao đây
    Cám ơn 1 lần nữa

Các đề tài tương tự

  1. Parsing Json sử dụng Serialization như thế nào ?
    Gửi bởi jvinhit trong diễn đàn Lập trình Windows Mobile bằng C#
    Trả lời: 1
    Bài viết cuối: 24-07-2014, 10:04 PM
  2. Serialization trong C#. Xin giúp đỡ!
    Gửi bởi thanhhaf trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 17-10-2009, 01:58 PM
  3. [C#] hỏi về XML Serialization
    Gửi bởi Jaychen trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 15-01-2008, 06:23 PM
  4. Sử dụng XML Serialization với các đối tượng tùy biến trong lập trình C#
    Gửi bởi baokhanhk28 trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 18-12-2006, 05:10 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn