c#T

2012-04-03 14 views
1

的实例我试图做一个genric代码来序列化和反序列化任何实现特定接口的对象。问题是我需要在调用.Deserialize()之前创建对象的实例,因为您无法在界面中使用静态函数。现在我的问题是我如何做一个T的实例?还是有更好的方法来实现我的目标?c#T

public static class Serializer 
{ 
    public static byte[] Serialize<T>(T Obj) where T : Data; 
    public static T Deserialize<T>(byte[] Data) where T : Data 
    { 
     //Here I need to something like: new T().Deserialize(Data); 
    } 
} 
public interface Data 
{ 
    public byte[] Serialize<T>(T obj); 
    public T Deserialize<T>(byte[] Data); 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Serializer.Deserialize<Dummy>(new byte[20]); 
    } 
} 
class Dummy : Data 
{ 

} 
+1

事实上,你需要一个(扔掉)实例表明有一些设计问题。 – 2012-04-03 12:37:30

+1

确保所有接口名称都以大写字母“I”开头。像'IData'一样,而不仅仅是'Data'。 – ja72 2012-04-03 12:41:57

+0

@HenkHolterman什么是更好的设计呢?我想有一个方法可以序列化任何实现接口的类。 – Svexo 2012-04-03 12:47:58

回答

8

更新 固定码/错别字

使用new()关键字

public interface IData 
{ 
    public byte[] Serialize<T>(T obj); 
    public T Deserialize<T>(byte[] Data); 
} 
public static class Serializer 
{ 
    public static byte[] Serialize<T>(T Obj) where T : IData; 
    public static T Deserialize<T>(byte[] data) where T : IData, new() 
    { 
     T res=new T(); 
     res.Deserialize<T>(data); 
     return res; 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Serializer.Deserialize<Dummy>(new byte[20]); 
    } 
} 
class Dummy : IData 
{ 

} 
+1

这确实回答了直接的问题。但是如果'T'是IDisposable,或者通常很贵? – 2012-04-03 12:40:18

+0

只写了同样的东西。请注意,公共无参数构造函数将是强制性的,但如果需要序列化,这不是一个主要限制。 – 2012-04-03 12:40:32

+1

只是想悄悄提到一个小错字,你有访问修饰符''Data''接口'方法,你显然是从问题中复制:) – Craig 2012-04-03 12:47:18

0

尝试:

Data val = System.Activator.CreateInstance(typeof(T)) as Data; 

然后

val.Deserialize(Data); 
+0

命名空间'System.Reflection'中不存在类型或名称空间名称'Activator'(您是否缺少程序集引用?) 是否需要包含引用? – Svexo 2012-04-03 12:39:37

+2

如果你打算真的在一个默认的构造函数,那么为什么不把它作为T的通用约束,然后使新的T()合法,并且在类型没有缺省构造函数的情况下会失败编译时间而不是运行时间 – 2012-04-03 12:41:39

+0

@Svexo,对不起,它是System.Activator。我为此更新了。而且符文FS是对的,你应该对T做一个约束来确保这个工作。 – 2012-04-03 12:58:23

2

你可能想看看ISerializable这是为了这个目的而不是创建自己的。

+0

本来是一个很好的评论。 – 2012-04-03 12:36:14

+1

@HenkHolterman我认为,但我认为这可能真的是答案,因为这似乎正在创造一些已经存在的东西。你还是不同意......我没有任何问题,将其改为评论。 – Craig 2012-04-03 12:38:20

1

如果你的类型都有一个默认的构造函数,或者如果它是明智的让他们有一个你可以simpky添加约束到请求默认参数的t参数,并且您注释掉的代码是合法的

public static T Deserialize<T>(byte[] Data) where T : Data, new() 
     { 
      new T().Deserialize(Data); 
     } 
+0

无法创建变量类型“T”的实例,因为它没有new()约束。 这就是为什么我问这个问题,我试过这种方式,但有错误。 – Svexo 2012-04-03 12:43:03

+0

@Svexo,Ow我忘了,new() – Svexo 2012-04-03 12:43:59