2016-11-29 4 views
1

TCP를 사용하여 네트워크를 통해 보내야하는 개체가 있습니다. 이 작업은 정상적으로 수행되었지만 이제는 구현이 확장되어 FlatBuffer 스키마를 정의하는 방법을 익히는 데 어려움을 겪고 있습니다.FlatBuffers KeyValuePair 데이터 형식 및 스키마 정의

public enum PredictionMethod 
{ 
    Distance = 1, 
    NGram = 2, 
} 

NGramPrediction은 다음과 같다 :

public class NGramPrediction 
{ 
    public KeyValuePair<char, int> Gram { get; set; } 
    public double Probability { get; set; } 
    public string Pattern { get; set; } 
    private int Total { get; set; } 
    private int Order { get; set; } 

    public NGramPrediction(Gram gram) 
    { 
     Total = gram.Total(); 
     var orderedKeyPosibilities = gram.Posibilities.OrderByDescending(x => x.Value); 

     Gram = orderedKeyPosibilities.First(); 

     Pattern = gram.Pattern; 
     Probability = (double)Gram.Value/Total; 

     Order = Pattern.Length; 
    } 
} 

public class Prediction 
{ 
    public PredictionMethod PredictionMethod { get; set; } 
    public NGramPrediction NGramPrediction { get; set; } 
    public DistancePrediction DistancePrediction { get; set; } 
    public int NGramOrder { get; set; } 
} 

PredictionMethod는 ENUM이다

송신하는 목적이있다 그램은 다음과 같습니다

public class DistancePrediction 
{ 
    public IIRVector3 Velocity { get; set; } 
    public float DeltaTime { get; set; } 
    public IIRVector3 Position { get; set; } 
} 

그리고 마지막으로, IIRVector3는 다음과 같습니다 : 나는 정의하기 위해 노력하고있어

public class IIRVector3 
{ 
    public IIRVector3() 
    { 
     X = 0; 
     Y = 0; 
     Z = 0; 
    } 
    public float X { get; set; } 
    public float Y { get; set; } 
    public float Z { get; set; } 
} 

public class Gram 
{ 
    public string Pattern { get; set; } 

    public Dictionary<char, int> Posibilities { get; set; } 

    public Gram(List<char> posibilities, int initialValue = 0) 
    { 
     Posibilities = new Dictionary<char, int>(); 
     foreach (var posibility in posibilities) 
     { 
      Posibilities.Add(posibility, initialValue); 
     } 
    } 

    public int Total() 
    { 
     var keys = Posibilities.Keys; 
     var total = 0; 
     foreach (var key in keys) 
     { 
      var value = Posibilities[key]; 
      total += value; 
     } 
     return total; 
     // return keys.Sum(key => Posibilities[key]); 
    } 

} 

DistancePrediction은 다음과 같습니다 FlatBuffers의 스키마 :

KeyValuePair<char, int>을해야
enum FBPredictionMethod 
{ 
    Distance = 1, 
    NGram = 2 
} 

struct FBIIRVector3 
{ 
    X:float; 
    Y:float; 
    Z:float; 
} 

table FBDistancePrediction 
{ 
    Velocity:FBIIRVector3; 
    DeltaTime:float; 
    Position:FBIIRVector3; 
} 

table FBGram 
{ 
    Pattern:string; 
    Possibilities: ???? 
} 

table FBNGramPrediction 
{ 
    Gram: ???? 
    Probability:float; 
    Pattern:string; 
    Total:short; 
    Order:short; 
} 

table FBPrediction 
{ 
    PredictionMethod:FBPredictionMethod; 
    NGramPrediction:FBNGramPrediction; 
    DistancePrediction:FBDistancePrediction; 
    NGramOrder:short; 
} 

root_type FlatServerToClientMessage; 

나는 모든 것이 올바른 보이는 생각하지만, 내가 무엇을 사전 위해 무엇을 할 생각이 없다가 ...

FBGram.PossibilitiesDictionary<char, int>FBGram해야한다.

참고 : NGramPrediction 생성자는 파라미터로서 Gram 걸리는 동안 그람 생성자는 List<char> 및 파라미터로서 int 걸린다.

누군가 내 스키마를 도와 줄 수 있습니까?

답변

2

KeyValuePair가 용이해야한다 .. 단지 두 개의 별도의 필드로 저장하거나 (즉 동일한 구조체 사용) struct KeyValuePair { key:byte; value:int; }

DictionaryPossibilities:[KeyValuePair]가 저장 될 수있는 사용. Possibilities이 큰 경우 공간을 절약하려면 PossibilityKeys:[byte]PossibilityValues:[int]이 조금 더 작지만 읽기/쓰기가 더 어려울 수 있습니다.

+1

@Aardapple 내 친구, 우리는 다시 만난다! 이전의 protobuff 문제에 대해 저를 도왔습니다. 그게 좋은 생각입니다! 나는 그것을 줄 것이다. 그램에 문제가 있습니까? char 목록에 [byte]를 사용할 수 있습니까? – pookie

+0

실제로'char'는 C#에서 유니 코드라는 것을 잊어 버렸으므로'byte' 대신'ushort'가 필요할 수도 있습니다. – Aardappel

+0

@Aardapple 생성자를 처리하는 방법을 모르겠습니다. 보시다시피, 그램은 Possible을 채우는 char (생성하기 쉽지만 생성자에 전달하는 방법)을 사용하며 NGramPrediction은 그램을 생성자 (KeyValuePair가 아닌)로 사용합니다.이 문제를 해결할 방법이 있습니까? – pookie