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.Possibilities는 Dictionary<char, int>
및 FBGram해야한다.
참고 : NGramPrediction
생성자는 파라미터로서 Gram
걸리는 동안 그람 생성자는 List<char>
및 파라미터로서 int
걸린다.
누군가 내 스키마를 도와 줄 수 있습니까?
@Aardapple 내 친구, 우리는 다시 만난다! 이전의 protobuff 문제에 대해 저를 도왔습니다. 그게 좋은 생각입니다! 나는 그것을 줄 것이다. 그램에 문제가 있습니까? char 목록에 [byte]를 사용할 수 있습니까? – pookie
실제로'char'는 C#에서 유니 코드라는 것을 잊어 버렸으므로'byte' 대신'ushort'가 필요할 수도 있습니다. – Aardappel
@Aardapple 생성자를 처리하는 방법을 모르겠습니다. 보시다시피, 그램은 Possible을 채우는 char (생성하기 쉽지만 생성자에 전달하는 방법)을 사용하며 NGramPrediction은 그램을 생성자 (KeyValuePair가 아닌)로 사용합니다.이 문제를 해결할 방법이 있습니까? – pookie