public void UnPackMap <TKey, TValue>(uint tag, string name, bool require, IDictionary <TKey, TValue> val) { val.Clear(); if (SkipToTag(tag)) { SdpPackDataType type = UnPackHead(ref tag); if (type == SdpPackDataType.SdpPackDataType_Map) { uint iSize = Unpack32(); if (val == null) { val = new Dictionary <TKey, TValue>((int)iSize); } ISerializer keySer = Sdp.GetSerializer <TKey>(); ISerializer valSer = Sdp.GetSerializer <TValue>(); for (var i = 0; i < iSize; ++i) { TKey key = Activator.CreateInstance <TKey>(); TValue value = Activator.CreateInstance <TValue>(); key = (TKey)keySer.Read(this, 0, require, key); value = (TValue)valSer.Read(this, 0, require, value); if (val.ContainsKey(key)) { val.Remove(key); } val.Add(key, value); } //for } //if } //if }
static void Main(string[] args) { TestSdp sdp = new TestSdp(); sdp.Values.Add(1); sdp.iValue = 127; sdp.strValue = "1"; sdp.KeyValues.Add(1, DateTime.Now); TestSdp sdp2 = new TestSdp(); sdp2.Deserialize(Sdp.Serializer(sdp)); //List<int> list = new List<int>() { 1, 21, 3, 4 }; //List<int> ls2 = Sdp.Deserialize<List<int>>(Sdp.Serializer(list)); //DateTime now = DateTime.Parse("2017/3/19"); //Console.WriteLine(CalNextWeekDay(now, 7, 24)); //List<eTest> list = new List<eTest>() { eTest.eFirst, eTest.eSecond }; //List<eTest> ls2 = Sdp.Deserialize<List<eTest>>(Sdp.Serializer(list)); /* * eTest test = (eTest)0x2106; * Console.WriteLine(test.ToString()); * Console.ReadKey(); */ Console.ReadKey(); }
public void Visit <T>(uint tag, string name, bool require, ref List <T> val) { if (require || val.Count > 0) { PackHead(tag, SdpPackDataType.SdpPackDataType_Vector); PackNum32((uint)val.Count); ISerializer ser = Sdp.GetSerializer <T>(); foreach (var t in val) { ser.Write(t, this, 0, true); } } }
public void Visit <TKey, TValue>(uint tag, string name, bool require, ref Dictionary <TKey, TValue> val) { if (require || val.Count > 0) { PackHead(tag, SdpPackDataType.SdpPackDataType_Map); PackNum32((uint)val.Count); ISerializer keySer = Sdp.GetSerializer <TKey>(); ISerializer valSer = Sdp.GetSerializer <TValue>(); foreach (var pair in val) { keySer.Write(pair.Key, this, 0, true); valSer.Write(pair.Value, this, 0, true); } } }
public bool UnPack <T>(ref T val, uint tag) { var ser = Sdp.GetSerializer <T>(); if (val == null) { val = Activator.CreateInstance <T>(); } if (ser != null) { val = (T)ser.Read(this, tag, true, val); return(true); } else { Type type = typeof(T); if (type.IsEnum) { VisitEunm(tag, null, true, ref val); return(true); } else { if (Sdp.IsContainer(type)) { Type[] genericTypes = type.GetGenericArguments(); object[] args = new object[] { tag, null, true, val }; if (genericTypes.Length == 1) { _UnPackList.MakeGenericMethod(genericTypes).Invoke(this, args); return(true); } else if (genericTypes.Length == 2) { _UnPackMap.MakeGenericMethod(genericTypes).Invoke(this, args); return(true); } } } } return(false); }
public void Visit <T>(uint tag, string name, bool require, ref List <T> val) { if (SkipToTag(tag)) { SdpPackDataType type = UnPackHead(ref tag); if (type == SdpPackDataType.SdpPackDataType_Vector) { uint iSize = Unpack32(); if (val == null) { val = new List <T>((int)iSize); } ISerializer ser = Sdp.GetSerializer <T>(); for (uint i = 0; i < iSize; ++i) { T t = Activator.CreateInstance <T>(); t = (T)ser.Read(this, 0, require, t); val.Add(t); } //for } //if } //if }