protobuf-net学习笔记

最近一直在做windows phone 7手机上面的应用程序,学到了一些除了微软这套东西以外的知识,除了Funambol这个库以外(等到完全研究懂了再写笔记),还有protobuf-net这个对数据进行序列化的工具。

其实protobuf-net只是protobuf在.net平台上的应用,而protobuf是google提供的供数据序列化的工具,在网上搜索能找到一大堆相关资料,估计这个工具对数据的处理速度和节省空间的能力都很强,所以很多人才用这个工具。在http://code.google.com/p/protobuf/ 上面有详细的说明,加上我对JAVA不感兴趣,在此就不做什么介绍了。

至于protobuf-net,则是由一个人进行开发的,这个程序员在自己的博客上贴出了很多资料,告诉人们怎么使用,地址在这里:http://marcgravell.blogspot.com/search/label/protobuf-net (需翻墙)http://code.google.com/p/protobuf-net/(这里是代码维护地址)

下面来说说如何使用

下载压缩包,解压后会发现有很多平台,至于我就需要选择windows phone平台,里面有三个文件

先把protobuf-net.dll 添加到工程引用

编写自定义的protobuf类,在我的程序中类(ProtoBuf.cs)如下:

using ProtoBuf;
using System.Collections.Generic;

namespace SyncControls
{
	[ProtoContract]
	public class PBCalendarItem
	{
        // required int64 pid = 1;
		[ProtoMember(1,IsRequired=true)]
		public long pid { get; set; }

        // required string title = 2;
		[ProtoMember(2, IsRequired = true)]
		public string title { get; set; }

        // required int64 created = 3;
        [ProtoMember(3, IsRequired = true)]
		public long created { get; set; }

        // required int64 modified = 4;
        [ProtoMember(4, IsRequired = true)]
		public long modified { get; set; }

        // optional int64 owner_id = 5;
		[ProtoMember(5, IsRequired = false)]
		public long owner_id { get; set; }

        // optional string location = 6;
		[ProtoMember(6, IsRequired = false)]
		public string location { get; set; }

        // optional string description = 7;
        [ProtoMember(7, IsRequired = false)]
		public string description { get; set; }

        // optional string timezone = 8;
		[ProtoMember(8, IsRequired = false)]
		public string timezone { get; set; }

        // optional int32 is_primary = 9;
        [ProtoMember(9, IsRequired = false)]
		public int is_primary { get; set; }

        // optional int32 is_public = 10;
        [ProtoMember(10, IsRequired = false)]
		public int is_public { get; set; }

        // optional int32 pub_status_only = 11;
		[ProtoMember(11, IsRequired = false)]
		public int pub_status_only { get; set; }

        // optional int32 searchable = 12;
		[ProtoMember(12, IsRequired = false)]
		public int searchable { get; set; }

        // optional string data_domain = 13;
		[ProtoMember(13, IsRequired = false)]
		public string data_domain { get; set; }

        // optional int32 calendar_type = 14;
		[ProtoMember(14, IsRequired = false)]
		public int calendar_type { get; set; }

        // optional string sync_state = 15;
		[ProtoMember(15, IsRequired = false)]
		public string sync_state { get; set; }

        // optional int32 access_type = 16;
		[ProtoMember(16, IsRequired = false)]
		public int access_type { get; set; }

        // optional string uuid = 17;
		[ProtoMember(17, IsRequired = false)]
		public string uuid { get; set; }

        // optional string color = 18;
		[ProtoMember(18, IsRequired = false)]
		public string color { get; set; }
	}
	
	[ProtoContract]
	public class PBScheduleItem
	{
        // required int64 pid = 1;
		[ProtoMember(1, IsRequired = true)]
		public long pid { get; set; }

        // required int64 calendar_id = 2;
		[ProtoMember(2, IsRequired = true)]
		public long calendar_id { get; set; }

        // required int64 created = 3;
		[ProtoMember(3, IsRequired = true)]
		public long created { get; set; }

        // required int64 modified = 4;
		[ProtoMember(4, IsRequired = true)]
		public long modified { get; set; }

        // required string calendar_type = 5;
		[ProtoMember(5, IsRequired = true)]
		public string calendar_type { get; set; }

        // optional string sync_state = 6;
		[ProtoMember(6, IsRequired = false)]
		public string sync_state { get; set; }

        // optional int64 owner_id = 7;
		[ProtoMember(7, IsRequired = false)]
		public long owner_id { get; set; }

        // optional int64 start_time = 8;
		[ProtoMember(8, IsRequired = false)]
		public long start_time { get; set; }

        // optional int32 duration = 9;
		[ProtoMember(9, IsRequired = false)]
		public int duration { get; set; }

        // optional int32 allday_event = 10;
		[ProtoMember(10, IsRequired = false)]
		public int allday_event { get; set; }

        // optional int32 access_type = 11;
		[ProtoMember(11, IsRequired = false)]
		public int access_type { get; set; }

        // optional int32 status_busy = 12;
		[ProtoMember(12, IsRequired = false)]
		public int status_busy { get; set; }

        // optional string title = 13;
		[ProtoMember(13, IsRequired = false)]
		public string title { get; set; }

        // optional string location = 14;
		[ProtoMember(14, IsRequired = false)]
		public string location { get; set; }

        // optional string description = 15;
		[ProtoMember(15, IsRequired = false)]
		public string description { get; set; }

        // optional string url = 16;
		[ProtoMember(16, IsRequired = false)]
		public string url { get; set; }

        // optional int32 check_completed = 17;
		[ProtoMember(17, IsRequired = false)]
		public int check_completed { get; set; }

        // optional int32 repeat_type = 18;
		[ProtoMember(18, IsRequired = false)]
		public int repeat_type { get; set; }

        // optional int32 repeat_finished = 19;
		[ProtoMember(19, IsRequired = false)]
		public int repeat_finished { get; set; }

        // optional int64 repeat_stop_time = 20;
		[ProtoMember(20, IsRequired = false)]
		public long repeat_stop_time { get; set; }

        // optional int32 repeat_count = 21;
		[ProtoMember(21, IsRequired = false)]
		public int repeat_count { get; set; }

        // optional int32 repeat_frequency = 22;
		[ProtoMember(22, IsRequired = false)]
		public int repeat_frequency { get; set; }

        // optional string repeat_month = 23;
		[ProtoMember(23, IsRequired = false)]
		public string repeat_month { get; set; }

        // optional string repeat_monthday = 24;
		[ProtoMember(24, IsRequired = false)]
		public string repeat_monthday { get; set; }

        // optional string repeat_day = 25;
		[ProtoMember(25, IsRequired = false)]
		public string repeat_day { get; set; }

        // optional string repeat_weekno = 26;
		[ProtoMember(26, IsRequired = false)]
		public string repeat_weekno { get; set; }

        // optional string repeat_yearday = 27;
		[ProtoMember(27, IsRequired = false)]
		public string repeat_yearday { get; set; }

        // optional string timezone = 28;
		[ProtoMember(28, IsRequired = false)]
		public string timezone { get; set; }

        // optional string uuid = 29;
		[ProtoMember(29, IsRequired = false)]
		public string uuid { get; set; }

        // optional string calendar_uuid = 30;
		[ProtoMember(30, IsRequired = false)]
		public string calendar_uuid { get; set; }

		[ProtoMember(31, IsRequired = false)]
		public List<PBScheduleExceptionItem> scheduleExceptions { get; private set; }

        [ProtoMember(32, IsRequired = false)]
		public List<PBScheduleAlarmItem> scheduleAlarms { get; private set; }


        [ProtoMember(33, IsRequired = false)]
		public List<PBScheduleUserItem> scheduleUsers { get; private set; }


        [ProtoMember(34, IsRequired = false)]
		public List<PBScheduleShareItem> scheduleShares { get; private set; }

        public PBScheduleItem()
        {
            scheduleExceptions = new List<PBScheduleExceptionItem>();
            scheduleAlarms = new List<PBScheduleAlarmItem>();
            scheduleShares = new List<PBScheduleShareItem>();
            scheduleUsers = new List<PBScheduleUserItem>();
        }
	}

	[ProtoContract]
	public class PBScheduleExceptionItem
	{
        // required int64 pid = 1;
		[ProtoMember(1, IsRequired = true)]
		public long pid { get; set; }

        // required int32 schedule_id = 2;
		[ProtoMember(2, IsRequired = true)]
		public int schedule_id { get; set; }

        // required string excep_date = 3;
		[ProtoMember(3, IsRequired = true)]
		public string excep_date { get; set; }

        // optional string sync_state = 4;
		[ProtoMember(4, IsRequired = false)]
		public string sync_state { get; set; }
	}

	[ProtoContract]
	public class PBScheduleAlarmItem
	{
        // required int64 pid = 1;
		[ProtoMember(1, IsRequired = true)]
		public long pid { get; set; }

        // optional int64 created = 2;
		[ProtoMember(2, IsRequired = false)]
		public long created { get; set; }

        // optional int64 modified = 3;
		[ProtoMember(3, IsRequired = false)]
		public long modified { get; set; }

        // required int64 schedule_id = 4;
		[ProtoMember(4, IsRequired = true)]
		public long schedule_id { get; set; }

        // required int64 user_id = 5;
		[ProtoMember(5, IsRequired = true)]
		public long user_id { get; set; }

        // required int64 alarm_id = 6;
		[ProtoMember(6, IsRequired = true)]
		public long alarm_id { get; set; }

        // required int32 before_minutes = 7;
		[ProtoMember(7, IsRequired = true)]
		public int before_minutes { get; set; }

        // optional int64 next_alarm = 8;
		[ProtoMember(8, IsRequired = false)]
		public long next_alarm { get; set; }

        // optional string sync_state = 9;
		[ProtoMember(9, IsRequired = false)]
		public string sync_state { get; set; }
	}

	[ProtoContract]
	public class PBScheduleUserItem
	{
        // required int64 pid = 1;
		[ProtoMember(1, IsRequired = true)]
		public long pid { get; set; }

        // required int64 schedule_id = 2;
		[ProtoMember(2, IsRequired = true)]
		public long schedule_id { get; set; }

        // required int64 user_id = 3;
		[ProtoMember(3, IsRequired = true)]
		public long user_id { get; set; }

        // required int32 is_owner = 4;
		[ProtoMember(4, IsRequired = true)]
		public int is_owner { get; set; }

        // required int32 participant_status = 5;
		[ProtoMember(5, IsRequired = true)]
		public int participant_status { get; set; }

        // optional int32 allow_edit = 6;
		[ProtoMember(6, IsRequired = false)]
		public int allow_edit { get; set; }

        // optional int32 allow_invite_others = 7;
		[ProtoMember(7, IsRequired = false)]
		public int allow_invite_others { get; set; }

        // optional int32 allow_view_participants = 8;
		[ProtoMember(8, IsRequired = false)]
		public int allow_view_participants { get; set; }

        // optional string participant_comment = 9;
		[ProtoMember(9, IsRequired = false)]
		public string participant_comment { get; set; }

        // optional string sync_state = 10;
		[ProtoMember(10, IsRequired = false)]
		public string sync_state { get; set; }
	}

	[ProtoContract]
	public class PBScheduleShareItem
	{
        // required int64 pid = 1;
		[ProtoMember(1, IsRequired = true)]
		public long pid { get; set; }

        // optional int64 created = 2;
		[ProtoMember(2, IsRequired = false)]
		public long created { get; set; }

        // optional int64 modified = 3;
		[ProtoMember(3, IsRequired = false)]
		public long modified { get; set; }

        // optional string sync_state = 4;
		[ProtoMember(4, IsRequired = false)]
		public string sync_state { get; set; }

        // required int64 schedule_id = 5;
		[ProtoMember(5, IsRequired = true)]
		public long schedule_id { get; set; }

        // required int64 contact_id = 6;
		[ProtoMember(6, IsRequired = true)]
		public long contact_id { get; set; }

        // optional string fullname = 7;
		[ProtoMember(7, IsRequired = false)]
		public string fullname { get; set; }

        // optional string mobile = 8;
		[ProtoMember(8, IsRequired = false)]
		public string mobile { get; set; }

        // optional string send_state = 9;
		[ProtoMember(9, IsRequired = false)]
		public string send_state { get; set; }
	}

	[ProtoContract]
	public class PBNoteItem
	{
        // required int64 pid = 1;
		[ProtoMember(1, IsRequired = true)]
		public long pid { get; set; }

        // required int64 created = 2;
		[ProtoMember(2, IsRequired = true)]
		public long created { get; set; }

        // required int64 modified = 3;
		[ProtoMember(3, IsRequired = true)]
		public long modified { get; set; }

        // optional string sync_state = 4;
		[ProtoMember(4, IsRequired = false)]
		public string sync_state { get; set; }

        // optional string title = 5;
		[ProtoMember(5, IsRequired = false)]
		public string title { get; set; }

        // optional int64 owner_id = 6;
		[ProtoMember(6, IsRequired = false)]
		public long owner_id { get; set; }

        // optional int32 state = 7;
		[ProtoMember(7, IsRequired = false)]
		public int state { get; set; }

        // optional int32 priority = 8;
		[ProtoMember(8, IsRequired = false)]
		public int priority { get; set; }

        // optional int64 finish_time = 9;
		[ProtoMember(9, IsRequired = false)]
		public long finish_time { get; set; }

        // optional int64 deadline = 10;
		[ProtoMember(10, IsRequired = false)]
		public long deadline { get; set; }

        // optional string tags = 11;
		[ProtoMember(11, IsRequired = false)]
		public string tags { get; set; }

        // optional int32 seq = 12;
		[ProtoMember(12, IsRequired = false)]
		public int seq { get; set; }

        // optional string uuid = 13;
		[ProtoMember(13, IsRequired = false)]
		public string uuid { get; set; }
	}
}


再编写转换类,这里是PBConverter.cs

using DataBase;
using System;
using DataManager;
using Utilities;

namespace SyncControls
{
	public static class DataBaseExMethods
	{
		#region Calendar
		public static PBCalendarItem ToProtoBuf(this CalendarItem t)
		{
			PBCalendarItem item = new PBCalendarItem();
			item.pid = t.Id;
			item.title = t.Title;
			item.created = t.Created;
			item.modified = t.Modified;
			item.owner_id = t.OwnerId;
			item.location = t.Location;
			item.description = t.Description;
			item.timezone = t.TimeZone;
			item.is_primary = t.IsPrimary ? 1 : 0;
			item.is_public = t.IsPublic ? 1 : 0;
			item.pub_status_only = t.PubStatusOnly ? 1 : 0;
			item.searchable = t.Searchable ? 1 : 0;
			item.data_domain = t.DataDomain;
			item.calendar_type = t.CalendarType;
			item.access_type = t.AccessType;
			item.sync_state = t.SyncState;
			item.uuid = t.UUID;
			item.color = t.Color;
			return item;
		}

		public static void FromProtoBuf(this CalendarItem t, PBCalendarItem item)
		{
			t.Id = item.pid;
			t.Title = item.title;
			t.Created = item.created;
			t.Modified = item.modified;
			t.OwnerId = item.owner_id;
			t.Location = item.location;
			t.Description = item.description;
			t.TimeZone = item.timezone;
			t.IsPrimary = item.is_primary == 1;
			t.IsPublic = item.is_public == 1;
			t.PubStatusOnly = item.pub_status_only == 1;
			t.Searchable = item.searchable == 1;
			t.DataDomain = item.data_domain;
			t.CalendarType = item.calendar_type;
			t.AccessType = item.access_type;
			t.SyncState = item.sync_state;
			t.UUID = item.uuid;
			t.Color = item.color;
		}
		#endregion

		#region Note
		public static PBNoteItem ToProtoBuf(this NoteItem t)
		{
			PBNoteItem item = new PBNoteItem();
			item.pid = t.Id;
			item.title = t.Title;
			item.created = t.Created;
			item.modified = t.Modified;
			item.sync_state = t.SyncState;
			item.title = t.Title;
			item.owner_id = t.OwnerId;
			item.state = t.State;
			item.priority = t.Priority;
			item.finish_time = t.FinishTime;
			item.deadline = t.Deadline;
			item.tags = t.Tags;
			item.seq = t.Seq;
			item.uuid = t.UUID;
			return item;
		}

		public static void FromProtoBuf(this NoteItem t, PBNoteItem item)
		{
			t.Id = item.pid;
			t.Title = item.title;
			t.Created = item.created;
			t.Modified = item.modified;
			t.SyncState = item.sync_state;
			t.Title = item.title;
			t.OwnerId = item.owner_id;
			t.State = item.state;
			t.Priority = item.priority;
			t.FinishTime = item.finish_time;
			t.Deadline = item.deadline;
			t.Tags = item.tags;
			t.Seq = item.seq;
			t.UUID = item.uuid;
		}
		#endregion

		#region Schedule
		public static PBScheduleItem ToProtoBuf(this ScheduleItem t)
		{
			PBScheduleItem item = new PBScheduleItem();
			item.pid = t.Id;
			item.calendar_id = t.CalendarId;
			item.created = t.Created;
			item.modified = t.Modified;
			item.calendar_type = t.CalendarType;
			item.sync_state = t.SyncState;
			item.owner_id = t.OwnerId;
			item.start_time = UnixTimestampConverter.ConvertLocalToTimestamp(t.StartTime);
			item.duration = t.Duration;
			item.allday_event = t.AllDayEvent ? 1 : 0;
			item.access_type = t.AccessType;
			item.status_busy = t.StatusBusy ? 1 : 0;
			item.title = t.Title;
			item.location = t.Location;
			item.description = t.Description;
			item.url = t.Url;
			item.check_completed = t.Completed ? 1 : 0;
			item.repeat_type = t.RepeatType;
			item.repeat_finished = t.RepeatFinished ? 1 : 0;
			item.repeat_stop_time = t.RepeatStopTime;
			item.repeat_count = t.RepeatCount;
			item.repeat_frequency = t.RepeatFrequency;
			item.repeat_month = t.RepeatMonth;
			item.repeat_monthday = t.RepeatMonthDay;
			item.repeat_day = t.RepeatDay;
			item.repeat_weekno = t.RepeatWeekNumber;
			item.repeat_yearday = t.RepeatYearDay;
			item.timezone = t.TimeZone;
			item.uuid = t.UUID;
			item.calendar_uuid = CalendarManager.GetCalendarUUID(t.CalendarId);
			if (item.calendar_uuid == "")
			{
				return null;
			}

			return item;
		}

		public static void FromProtoBuf(this ScheduleItem t, PBScheduleItem item)
		{
			t.Id = item.pid;
			t.CalendarId = CalendarManager.GetCalendarID(item.calendar_uuid);
			t.Created = item.created;
			t.Modified = item.modified;
			t.CalendarType = item.calendar_type;
			t.SyncState = item.sync_state;
			t.OwnerId = item.owner_id;
			t.StartTime = UnixTimestampConverter.ConvertLocalFromTimestamp(item.start_time);
			t.Duration = item.duration;
			t.AllDayEvent = item.allday_event == 1;
			t.AccessType = item.access_type;
			t.StatusBusy = item.status_busy == 1;
			t.Title = item.title;
			t.Location = item.location;
			t.Description = item.description;
			t.Url = item.url;
			t.CheckCompleted = item.check_completed == 1;
			t.RepeatType = item.repeat_type;
			t.RepeatFinished = item.repeat_finished == 1;
			t.RepeatStopTime = item.repeat_stop_time;
			t.RepeatCount = item.repeat_count;
			t.RepeatFrequency = item.repeat_frequency;
			t.RepeatMonth = item.repeat_month;
			t.RepeatMonthDay = item.repeat_monthday;
			t.RepeatDay = item.repeat_day;
			t.RepeatWeekNumber = item.repeat_weekno;
			t.RepeatYearDay = item.repeat_yearday;
			t.TimeZone = item.timezone;
			t.UUID = item.uuid;
		}
		#endregion

		#region ScheduleAlarm
		public static PBScheduleAlarmItem ToProtoBuf(this ScheduleAlarmItem t)
		{
			PBScheduleAlarmItem item = new PBScheduleAlarmItem();
			item.pid = t.Id;
			item.created = t.Created;
			item.modified = t.Modified;
			item.sync_state = t.SyncState;
			item.schedule_id = t.ScheduleId;
			item.user_id = t.UserId;
			item.alarm_id = t.AlarmId;
			item.before_minutes = t.BeforeMinutes;
			return item;
		}

		public static void FromProtoBuf(this ScheduleAlarmItem t,PBScheduleAlarmItem item)
		{
			t.Id = item.pid;
			t.Created = item.created;
			t.Modified = item.modified;
			t.SyncState = item.sync_state;
			t.ScheduleId = item.schedule_id;
			t.UserId = item.user_id;
			t.AlarmId = (int)item.alarm_id;
			t.BeforeMinutes = item.before_minutes;
		}
		#endregion

		#region ScheduleException
		public static PBScheduleExceptionItem ToProtoBuf(this ScheduleExceptionItem t)
		{
			PBScheduleExceptionItem item = new PBScheduleExceptionItem();
			item.pid = t.Id;
			item.sync_state = t.SyncState;
			item.schedule_id = (int)t.ScheduleId;
			item.excep_date = Convert.ToString(t.ExceptDate);
			return item;
		}

		public static void FromProtoBuf(this ScheduleExceptionItem t, PBScheduleExceptionItem item)
		{
			t.Id = item.pid;
			t.SyncState = item.sync_state;
			t.ScheduleId = item.schedule_id;
			t.ExceptDate = Convert.ToInt64(item.excep_date);
		}
		#endregion

		#region ScheduleShare
		public static PBScheduleShareItem ToProtoBuf(this ScheduleShareItem t)
		{
			PBScheduleShareItem item = new PBScheduleShareItem();
			item.pid = t.Id;
			item.created = t.Created;
			item.modified = t.Modified;
			item.sync_state = t.SyncState;
			item.schedule_id = t.ScheduleId;
			item.fullname = t.FullName;
			item.mobile = t.Mobile;
			item.send_state = t.SendState;
			return item;
		}

		public static void FromProtoBuf(this ScheduleShareItem t, PBScheduleShareItem item)
		{
			t.Id = item.pid;
			t.Created = item.created;
			t.Modified = item.modified;
			t.SyncState = item.sync_state;
			t.ScheduleId = item.schedule_id;
			t.FullName = item.fullname;
			t.Mobile = item.mobile;
			t.SendState = item.send_state;
		}
		#endregion

		#region ScheduleUser
		public static PBScheduleUserItem ToProtoBuf(this ScheduleUserItem t)
		{
			PBScheduleUserItem item = new PBScheduleUserItem();
			item.pid = t.Id;
			item.schedule_id = t.ScheduleId;
			item.user_id = t.UserId;
			item.is_owner = t.IsOwner ? 1 : 0;
			item.participant_status = t.ParticipantStatus;
			item.allow_edit = t.AllowEdit ? 1 : 0;
			item.allow_invite_others = t.AllowInviteOthers ? 1 : 0;
			item.allow_view_participants = t.AllowViewParticipants ? 1 : 0;
			item.participant_comment = t.ParticipantComment;
			item.sync_state = t.SyncState;
			return item;
		}

		public static void FromProtoBuf(this ScheduleUserItem t, PBScheduleUserItem item)
		{
			t.Id = item.pid;
			t.ScheduleId = item.schedule_id;
			t.UserId = item.user_id;
			t.IsOwner = item.is_owner == 1;
			t.ParticipantStatus = item.participant_status;
			t.AllowEdit = item.allow_edit == 1;
			t.AllowInviteOthers = item.allow_invite_others == 1;
			t.AllowViewParticipants = item.allow_view_participants == 1;
			t.ParticipantComment = item.participant_comment;
			t.SyncState = item.sync_state;
		}
		#endregion
	}
}


使用的时候,只需要按照下面方式写即可

		protected override SyncItem GetItemContent(SyncItem item)
		{
			CalendarItem t = CalendarManager.GetCalendarByID(Convert.ToInt64(item.Key));
			PBCalendarItem pbItem = t.ToProtoBuf();
			return ToSyncItem(pbItem);
		}

		private SyncItem ToSyncItem(PBCalendarItem pbItem)
		{
			SyncItem item = new SyncItem(Convert.ToString(pbItem.pid));
			string syncState = pbItem.sync_state; 
			MemoryStream stream = new MemoryStream();
            //序列化
			Serializer.Serialize<PBCalendarItem>(stream, pbItem);
			item.SetContent(stream.GetBuffer());
			return item;
		}

		private PBCalendarItem FromSyncItem(SyncItem item)
		{
			byte[] b = item.GetContent();
			PBCalendarItem pbItem = null;
			try
			{
				MemoryStream stream = new MemoryStream(b);
                //反序列化
				pbItem = Serializer.Deserialize<PBCalendarItem>(stream);
			}
			catch { }
			return pbItem;
		}


这里是把数据写入到一个内存流里面,而不是通常意义上的文件之中,如果是文件可以看这里的例子

http://hi.baidu.com/jack1865/item/09a3f8ef4c8505f2eb34c957

以上只是对这个工具的简单使用说明而已,现在protobuf-net的作者已经开发出了更强的序列号工具,通过他给的precompiler工具加上自己写的特定框架下的试验工程,编译得到适合该特定框架下的序列化工具。

precompile {some path}\PhoneDto.dll –o:PhoneSerializer.dll –t:MySerializer

Then, just use MySerializer:

var ser = new MySerializer();
ser.Serialize(output, obj);

看来还有很多知识要学习。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值