我有抽象类A
,可以将自己序列化为byte[]
。
另一个类C
使用类型T
进行参数化,该类型应该是A
或从C
继承而且具有无参数构造函数。 T
需要在byte[]
和Class C <T> where T : A, new() { ... }
之间进行双向转换。
T
问题是:如何从byte[]
获取A
?
我无法使用T(byte[])
中的某些静态方法,因为我无法覆盖它。我无法调用T
,因为C#不允许它。
我找到的唯一方法是创建A
的实例并调用从byte[] bytes; // some byte table
T someT = new T();
T.LoadFromBytes(bytes);
覆盖的某个方法,即:
T
我会工作,但在很多情况下我只能从字节转换为public class SomeTClass : A
{
public SomeTClass(){...}
public void LoadFromBytes(byte[] bytes)
{
SomeTClass newT = Sth(bytes); /* new instance of SomeTClass
is created from bytes */
this = newT; /* can't do this, but I need to replace
current instance with the new one */
}
}
的新对象。
有没有更好的解决方案或任何方式做某事:
{{1}}
答案 0 :(得分:0)
查看UpdateReference
方法和反序列化实现。我认为您应该将反序列化方法设为farbic method
。它应该byte[]
作为输入参数并返回您需要的新类型实例。
这是你想要的吗?
class C <T> where T : IA, new()
{
public T Data { get; set; }
.....
public UpdateReference()
{
byte[] data = GetBytesFromSomewhere();
Data = AImpl.Deserialize(data);
Data.UserfulMethod();
Data.AnotherUserfulMethod();
data = GetBytesFromSomewhere();
Data = AImpl.Deserialize(data)
Data.UserfulMethod();
Data.AnotherUserfulMethod();
}
}
public interface IA
{
public byte[] Serialize();
public A Deserialize(byte[] data);
public string UsefuleMethod1();
public int AnotherUsefulMethod();
}
public class AImpl : IA
{
public byte[] Serialize()
{
//Concrete implementation serialization
}
public static IA Deserialize(byte[] data)
{
//Concrete implementation deserialization
}
}
答案 1 :(得分:0)
我设法解决了这个问题,但我不喜欢我创建的代码。
这个想法是用T参数化A类并创建抽象方法,如果没有从模板类型中使用它,它将是静态的:
public abstract class A <T>
{
public abstract byte[] Serialize();
public abstract T Deserialize(byte[]); //should be static
}
班级C
有新的要求:
public class C <T> where T : A <T>
{
someMethod(...)
{
...
byte[] bytes; // some bytes
T = new T().Deserialize(bytes); // should be T.Deserialize(bytes)
...
}
}
一些T
实施:
public class SomeTClass : A<SomeTClass>
{
public SomeTClass Deserialize(byte[])
{
//deserialization code
}
}