2013-02-11 53 views
1

我有抽象類A可以序列化自己的往返byte[]替換類內的類實例

另一個類C參數化爲T類型,它應該是或從A繼承並且具有無參數構造函數。 C需要在Tbyte[]之間進行雙向轉換。

Class C <T> where T : A, new() { ... } 

的問題是:如何從byte[]T

我無法使用A中的某些靜態方法,因爲我無法覆蓋它。我不能撥打T(byte[]),因爲C#不允許。

我發現的唯一辦法是T創建實例,並調用從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 */ 
    } 
} 
+0

什麼serializa的類型你正在使用?這很重要...... – James 2013-02-11 15:09:41

+0

你的第二句話有點令人困惑,'C'需要'T',但是你的限制是'A'。 – 2013-02-11 15:10:09

+0

你有沒有一個類工廠,每個類型都需要一個實例? – QuentinUK 2013-02-11 15:11:02

回答

0

我設法解決這個問題,但我不喜歡我創建的代碼。

的想法是參數化類A與T和創建抽象方法,這將是靜態的,如果它不是從模板類型可以使用:

public abstract class A <T> 
{ 
    public abstract byte[] Serialize(); 
    public abstract T Deserialize(byte[]); //should be static 
} 

C具有新reguirement:

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 
    } 
} 
+0

如果還有更好的方法,請提供。 – Ari 2013-02-11 15:46:29

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 
    } 
} 
+0

在您的代碼中,只允許'AImpl'作爲IA使用。我的意思是,從'IA'派生的所有類都可以有自己的[de]序列化器。 – Ari 2013-02-11 15:25:29

+0

你如何期待你的代碼應該決定從byte []中反序列化哪個類?例如,您有AImpl1,AImpl2和AImpl3。你的代碼只知道'byte []' - 它的反序列化方法應該被調用? – 2013-02-11 15:29:39

+0

你可以用某種標記字節預先寫入'byte []',用接口方法將接口轉換爲抽象類。這種方法將分析標記字節並調用相應的解串器。 – 2013-02-11 15:30:55