guid的值为null如何在C#反序列化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了guid的值为null如何在C#反序列化相关的知识,希望对你有一定的参考价值。
guid是数据库里面的查出来的(null),需要反序列化到list集合中,集合中为guid类型,求大神解答
1.这里选择继承了 BCL 中的类 EventArgs,可以在事件的触发时进行数据的传递。
1 class MyEventArgs : EventArgs 2 3 public string Message get; private set; 4 5 public MyEventArgs(string message) 6 7 Message = message; 8 9
2.这里的第二个参数就是自定义的 MyEventArgs 类型,它继承了 EventArgs。
delegate void MyEventHandler(object sender, MyEventArgs args);
3.声明事件的几种形式:
(1)如果没有自定义 EventArgs 类,你可以直接使用 C# 中默认提供的非泛型 EventHandler 委托。
public event EventHandler MyEvent;
(2)如果使用的是非泛型的 EventHandler,并且写了一个自定义由 EventArgs 派生的类,可修改如下。
public event MyEventHandler MyEvent;
(3)如果使用的是高级的泛型版本,就不需要自定义委托。你只需要简单地将事件类型指定为 EventHandler<MyEventArgs>,将尖括号中的内容替换为自己的类的名称。
public event EventHandler<MyEventArgs> MyEvent;
下面的示例通过将自定义的 MyEventArgs 类和 EventHandler<TEventArgs> 进行演示:
This is MyEventArgs.cs //事件参数
1 /// <summary> 2 /// 事件参数 3 /// </summary> 4 /// <remarks>一个自定义的类:自定义事件的参数</remarks> 5 class MyEventArgs : EventArgs 6 7 public string Message get; 8 9 public MyEventArgs(string message) 10 11 Message = message; 12 13
This is Publisher.cs //发布者
1 /// <summary> 2 /// 事件发布者 3 /// </summary> 4 class Publisher 5 6 //声明一个泛型事件 7 public event EventHandler<MyEventArgs> MyEvent; 8 9 public void Publish() 10 11 Console.WriteLine("Publis is starting"); 12 13 //你可以在事件触发前写些代码 14 15 OnMyEvent(new MyEventArgs(DateTime.Now.ToString())); 16 17 18 /// <summary> 19 /// 触发事件 20 /// </summary> 21 /// <param name="args"></param> 22 /// <remarks>虚方法,允许子类重写调用行为</remarks> 23 protected virtual void OnMyEvent(MyEventArgs args) 24 25 //只有在事件订阅时(!= null),才触发事件 26 MyEvent?.Invoke(this, args); 27 28
This is Subscriber.cs //订阅者
1 /// <summary> 2 /// 订阅者 3 /// </summary> 4 class Subscriber 5 6 public Guid Guid get; 7 8 public Subscriber(Publisher publisher) 9 10 Guid = Guid.NewGuid(); 11 //使用 C# 2 的语法进行订阅 12 publisher.MyEvent += Publisher_MyEvent; 13 14 15 /// <summary> 16 /// 事件处理程序 17 /// </summary> 18 /// <param name="sender"></param> 19 /// <param name="args"></param> 20 private void Publisher_MyEvent(object sender, MyEventArgs args) 21 22 Console.WriteLine($" Message is args.Message, Guid is Guid."); 23 24
This is Program.cs //控制台,用于启动
1 class Program 2 3 static void Main(string[] args) 4 5 var publisher = new Publisher(); 6 var subscriber1 = new Subscriber(publisher); 7 var subscriber2 = new Subscriber(publisher); 8 9 //触发事件 10 publisher.Publish(); 11 12 Console.WriteLine("OK!"); 13 Console.Read(); 14 15
事件一种是特殊类型的多播委托,只能从声明它的类中进行调用。这些方法需要预先通过事件访问器添加到委托的调用列表中,事件访问器跟我们平时使用的属性访问器,特殊的是他们的名字,事件访问器被命名为 add 和 remove。如果在代码中没有提供自定义的事件访问器,编译器会自动添加事件访问器。但在某些情况下,您可能需要提供自定义的行为。
1 class MyClass 2 3 /// <summary> 4 /// 锁 5 /// </summary> 6 private static object Locker = new object(); 7 8 /// <summary> 9 /// 接口 10 /// </summary> 11 public interface IMyEvent 12 13 event EventHandler OnCall; 14 15 16 public class MyEvent : IMyEvent 17 18 /// <summary> 19 /// 触发前事件 20 /// </summary> 21 event EventHandler PreEvent; 22 23 public event EventHandler OnCall 24 25 add 26 27 lock (Locker) 28 29 PreEvent += value; 30 31 32 remove 33 34 lock (Locker) 35 36 PreEvent += value; 37 38 39 40 41
参考技术A你可以将List定义为List<Guid?>这样就可以存空值,或者将默认的null在list中转为 "00000000-0000-0000-0000-000000000000"
比如说你查出来是一个叫dt的datatable,数据库字段叫guid,用前一种方法
List<Guid?> list=new List<Guid?>();foreach(DataRow dr in dt.rows)
if(Convert.ISDBNull(dr["guid"]) list.Add(null);
else list.Add(Guid.Parse(dr["guid"].ToString()));
后一种方法
List<Guid> list=new List<Guid>();Guid zero= Guid.Parse("00000000-0000-0000-0000-000000000000");
foreach(DataRow dr in dt.rows)
if(Convert.ISDBNull(dr["guid"]) list.Add(zero);
else list.Add(Guid.Parse(dr["guid"].ToString()));
后一种方法,如果你要判断是不是空值,可以用比如list[i]==Guid.Empty来比较,如果为真则说明无效。
transient关键字有何作用
使用对象流保存对象时,将对象的全部信息都保存了,但是有些信息是不希望保存,如密码,该如何避免该信息的保存?
使用transient关键字修饰的属性,在保存对象时,该属性并不会被保存。
transient用于修饰不需要序列化的字段,
如果一个引用类型被transient修饰,
则其反序列化的值为null,
如果一个基本类型被transient修饰,
则其反序列化的值为0,如果字段的引用类型是不可序列化的类,则也应该使用transient修饰,它在序列化时会被直接跳过。
以上是关于guid的值为null如何在C#反序列化的主要内容,如果未能解决你的问题,请参考以下文章